/*
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;
}
POJ_3660
最新推荐文章于 2019-06-08 20:55:52 发布