POJ3660—有向图的传递闭包问题

来源:互联网 发布:淘宝详情页设计模版 编辑:程序博客网 时间:2024/05/21 17:37

题目很简单,就是求有多少只奶牛的排名可以确定下来。因为每只奶牛的排名是固定的,共有n只奶牛,排在它之前和排在它之后的奶牛的总数是n-1,如果满足这个条件,则该奶牛的排名就可以确定下来。用类似于Floyd算法的传递闭包算法,如果a的排名先于b的排名,则生成一条由a指向b的有向边,然后再按照上面的思想就很容易解决了。

#include <iostream>#include <cstdio>using namespace std;const int maxn=102;bool t[maxn][maxn];      //t[i][j]=true表示由点i到点j是连通的int main(){    int i,j,k,n,m,a,b,ans,temp;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=0;i<n;i++)        for(j=0;j<n;j++)        t[i][j]=false;        for(i=0;i<m;i++)        {            scanf("%d%d",&a,&b);            t[a-1][b-1]=true;        }        for(k=0;k<n;k++)        for(i=0;i<n;i++)        for(j=0;j<n;j++)        t[i][j]=t[i][j] || (t[i][k] && t[k][j]);        ans=0;        for(i=0;i<n;i++)        {            temp=0;            for(j=0;j<n;j++)            temp+=t[i][j]+t[j][i];            if(temp==n-1)            ans++;        }        printf("%d\n",ans);    }    return 0;}


 

原创粉丝点击