初看起来是拓扑排序,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);
}