今天讲了最短路径的算法,我了个去,一天讲三个算法就让做题,贼鸡儿难啊,算法讲的还不大明白,看来宝宝太弱了,唉,让我静静的哭一会吧。
废话不多说讲题
题目大意就是给出一些牛的胜负关系,然后,让你确定有几只牛的排名可以确定。
一开始以为用拓扑,但是师哥说用floyd做,可难死宝宝了,看了网上的代码,才明白floyd用来确定每两个点之间的关系。
大体思路:确定每个点的出度和入度,如果这个点的出度和入度之和为n - 1,那样就确定了这个点的位置。
#include<cstdio>
#include<iostream>
using namespace std;
int _map[101][101];
const int MAX = 0x3f3f3f3f;
void floyd(int n)
{
for(int k = 1; k <= n;++k)
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n;++j)
{
_map[i][j] = _map[i][j] || (_map[i][k] & _map[k][j]);
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = 0; i <= n; ++i)
for(int j = 0; j <= n;++j)
{
if(i == j)
{
_map[i][j] = 1;
}
else
_map[i][j] = 0;
}
for(int i = 0; i <= m - 1; ++i)
{
int a,b;
scanf("%d%d",&a,&b);
_map[a][b] = 1;
}
floyd(n);
int ans = 0;
for(int i = 1; i <= n; ++i)
{
int cnt = 0;
for(int j = 1; j <= n; ++j)
{
if(_map[i][j])
cnt++;
if(_map[j][i])
cnt++;
}
if(cnt == n + 1)
ans++;
}
cout << ans << endl;
return 0;
}
真菜啊!。好好看看floyd .