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
原创粉丝点击