有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强。
问最后有多少名学生可以确定他的排名。
保证输入信息不存在矛盾
思路
一开始先看的Floyed算法,看了一个模模糊糊就来做的这个题,做完这个题发现这个题Floyed模板好理解呢
就是将那个模板的判断条件改一下
一开始输入的a和b 用一个二位数组存,表示两个同学之间存在名次关系
然后再借助k来判断关系
如果a和k之间有关系,而且k和b之间也有关系(不能换位置
那么a和b就有名次关系
即判断条件
if(e[i][k]==1&&e[k][j]==1)
e[i][j]=1;
最后
再从第一个的同学开始找他和其他人的关系
如果关系等于n-1他的名次就确定了(出度+入度=顶点数-1
代码如下
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n,m,i,j,k,a,b,e[110][110];
int count=0,ans=0;
cin>>n>>m;
memset(e,0,sizeof(e));
for(i=1;i<=m;i++)
{
cin>>a>>b;
e[a][b]=1;
}
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(e[i][k]==1&&e[k][j]==1)
e[i][j]=1;
}
}
}
ans=0;
for(i=1;i<=n;i++)
{
count=0;
for(j=1;j<=n;j++)
{
if(e[i][j]==1||e[j][i]==1)
count++;
}
if(count==n-1)
ans++;
}
cout<<ans<<endl;
return 0;
}