题目链接:http://poj.org/problem?id=3660
有n头奶牛还有m种关系a,b表示a牛逼b彩笔,所以a排名比b高
最后问你给出的关系最多能确定多少头奶牛的排名,而且给出的数据不会有矛盾
其实就是给出了一个无环的有向图,只要有一点他能跟所有点有联系那么这个点的排名就知道了。
可以用一下floyd的思想还是能简单实现的。
其实这题简单来说就是能走完所有点的路都经过哪些点,最容易想到的就是floyd求多源点的最短路
然后稍微改一下就好了。
#include <iostream> #include <cstring> #include <string> using namespace std; int n , m , a , b , mmp[110][110] , In[110] , Out[110] , counts; bool vis[110][110]; void bfs() { memset(vis , false , sizeof(vis)); for(int k = 1 ; k <= n ; k++) { for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= n ; j++) { if(mmp[i][k] != 0 && mmp[k][j] != 0) { if(!vis[i][j]) { In[j]++; Out[i]++; vis[i][j] = true; mmp[i][j] = 1; } } } } } for(int i = 1 ; i <= n ; i++) { //cout << i << ' ' << In[i] << ' ' << Out[i] << endl; if(In[i] + Out[i] == n + 1) { counts++; } } } int main() { cin >> n >> m; for(int i = 1 ; i <= n ; i++) { In[i] = 0 , Out[i] = 0; for(int j = 1 ; j <= n ; j++) { mmp[i][j] = 0; } mmp[i][i] = 1; } for(int i = 1 ; i <= m ; i++) { cin >> a >> b; mmp[a][b] = 1; } counts = 0; bfs(); cout << counts << endl; return 0; }