POJ_3660
来源:互联网 发布:网络律师 编辑:程序博客网 时间:2024/05/01 15:13
/*poj 3660又是n(100)头牛,牛要干一架了,给你打架的结果M(a,b),a赢b,问几头牛的实力可以被确定(4,3)(4,2)(3,2)(1,2)(2,5)这个会是最短路,感觉不像啊还不如顶点出发,扫描遍过去,最后如果访问次数为n-1,表示其他点都可以访问我,几关系确定嘿嘿,AC*/#include<iostream>#include<cstdio>#include<cstring>const int maxn = 105;using namespace std;int mp[maxn][maxn];int vis[maxn],dp[maxn];int que[maxn*1000],qs,qe;int n,m;void watch(int s){ qs = qe = 0; memset(vis, 0,sizeof(vis)); que[qs++] = s; vis[s] = 1; while(qe!=qs) { int top = que[qe++]; for(int i = 1; i <= n; i++) { if(!vis[i]&&mp[top][i]) { vis[i] = 1; que[qs++] = i; dp[i]++; } } }}int main(){ int a,b; while(scanf("%d%d",&n,&m)!=EOF) { memset(mp, 0,sizeof(mp)); memset(dp, 0,sizeof(dp)); while(m--) { scanf("%d%d",&a,&b); mp[a][b] = 1; } for(int i = 1; i <= n; i++) watch(i); for(int i = 1; i <= n; i++) { for(int j = i+1; j <= n; j++) { mp[i][j] = mp[i][j]^mp[j][i]; mp[j][i] = mp[j][i]^mp[i][j]; mp[i][j] = mp[i][j]^mp[j][i]; } } int ans = 0; for(int i = 1; i <= n; i++) watch(i); for(int i = 1; i <= n; i++) if(dp[i] == n-1)ans++; printf("%d\n",ans); } return 0;}
0 0