题意:
给定n头牛, 然后有m个比较, 求出有多少头牛能确定自己的排名。
分析:
假设有一头牛a, 有ki头牛强于自己, kj头牛弱于自己, ki + kj == n-1时, 那么这头牛的排名就确定了。
对于每个比较建一条有向边
求出a点可达哪些点, 哪些点可达a点即可
#include<cstdio> #include<string> #include<iostream> #include<cstring> #include<vector> #include<map> #include<queue> #define rep(i,a,b) for(int i = a; i < b; i++) #define _rep(i,a,b) for(int i = a; i <= b; i++) using namespace std; const int maxn = 107; const int inf = 1e9; int G[maxn][maxn]; int n , m; int main() { while(~scanf("%d %d", &n, &m)){ rep(i,1,maxn) rep(j,1,maxn) G[i][j] = 0; rep(i,0,m) { int u, v; scanf("%d %d", &u, &v); G[u][v] = 1; } for(int k = 1; k <= n; k++){ for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(G[i][j] == 0) G[i][j] = G[i][k] && G[k][j]; //只有当 G[i][k] && G[k][j] 都有路时, G[i][j]才算联通 } } } int ans = 0; _rep(i,1,n){ int cnt = 0; _rep(j,1,n){ if(G[i][j]) cnt++; if(G[j][i]) cnt++; } if(cnt == n - 1) ans++; } printf("%d ", ans); } return 0; }