题意:
有n(1<=n<=100)个学生参加编程比赛。
给出m条实力信息。(1<=M<=4500)
其中每一条的格式为 A B (1<=A<=N,1<=B<=N,A!=B) 意思是A的实力比B强。
如果A比B强且B比C强,那么A一定比C强。
问最后有多少名学生可以确定他的排名。
保证输入信息不存在矛盾
思路:
初始化有联系的点得边为1,用floyd把有间接联系的点的边(邻接矩阵)赋值为1,最后扫一遍图统计每个点有联系的点的总数,如果等于n-1,则cnt++。
#include<iostream>
#include<cstring>
using namespace std;
int e[105][105];
int main()
{
int n,m;
while(cin>>n>>m)
{
memset(e,0,sizeof(e));
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
e[a][b]=1;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(e[i][k]&&e[k][j])
{
e[i][j]=1;
}
}
}
}
int flag=0,cnt=0,t1[105]={0};
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(e[i][j])
{
t1[i]++,t1[j]++;
}
}
}
for(int i=1;i<=n;i++)
{
if(t1[i]==n-1)
{
cnt++;
}
}
cout<<cnt<<endl;
}
return 0;
}