POJ3660 Cow ContestFloyd算法

    技术2022-05-18  12

    初看起来是拓扑排序,DFS了一会儿之后发现不对头。。

    仔细想想才看出原来是Floyd..

    用1表示a>b,用2表示a<b,用0表示关系无法确定,然后,把FLoyd的缩边改成:if(Graph[j][i]==Graph[i][k] && Graph[j][i]) Graph[j][k]=Graph[j][i];

    最后的Graph数组就表示了任意两个点之间的关系。

    然后,就可以判断一下是不是某点与其它点之间的关系都是确定的(Graph数组中对应值不是0)。

    #include<cstdio> #include<functional> #include<algorithm> using namespace std; const int MAX=110; int Graph[MAX][MAX]; int main() { //freopen("in.txt","r",stdin); int v,e,a,b; scanf("%d%d",&v,&e); for(int i=0;i!=e;i++) { scanf("%d%d",&a,&b); Graph[a-1][b-1]=1; Graph[b-1][a-1]=2; } for(int i=0;i!=v;i++) for(int j=0;j!=v;j++) for(int k=0;k!=v;k++) if(Graph[j][i]==Graph[i][k] && Graph[j][i]) Graph[j][k]=Graph[j][i]; int cnt=0; for(int i=0;i!=v;i++) if(count_if(Graph[i],Graph[i]+v,bind2nd(equal_to<int>(),0))==1) cnt++; printf("%d/n",cnt); } 


    最新回复(0)