算法1
(floyd最短路) $O(n^3)$
这里核心的思想是如何判断两头牛可不可比较,可以抽象为在这个单向图中两头牛可不可达,如果其中一头牛可以到达另一头牛则说明两头牛是可以比较的,如果一头牛可以和其他n-1头牛比较则说明这头牛的位次是确定的。
由于需要判断多头牛可不可达其余n-1头牛,则此问题属于多源最短路问题,应使用floyd算法预处理,毕竟数据范围才到100;
时间复杂度
参考文献
C++ 代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N =110,INF=1e9;
int g[N][N];
int n,m,ans;
int main(){
cin >> n >> m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)//初始化
if(i==j)g[i][j]=0;
else g[i][j]=INF;
while(m--){
int x,y;
cin >> x>> y;//存边
g[x][y]=1;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)//最短路处理
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
for(int i=1;i<=n;i++){
int t=0;//记录能和第i头牛比较的牛的个数
for(int j=1;j<=n;j++)
if(g[i][j]<INF/2||g[j][i]<INF/2)t++;//如果距离不是正无穷说明可达
if(t==n)ans++;//注意由于g[i][i]=0所以表示自己可以和自己比较,则当可比较数为n时才说明这头牛的位次固定
}
cout << ans;
}
牛的!大佬,连不用看代码,我就感觉会了
我是菜菜 已经有一两个月没写题了 现在回来康复来了