bzoj1612 / P2419 [USACO08JAN]牛大赛Cow Contest(Floyd)
P2419 [USACO08JAN]牛大赛Cow Contest
Floyd不仅可以算最短路,还可以处理点之间的关系。
跑一遍Floyd,处理出每个点之间是否有直接或间接的关系。
如果某个点和其他$n-1$个点都有关系,那么它的排名就是可确定的。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define re register 5 using namespace std; 6 int n,m,d[302][302],ans; 7 int main(){ 8 scanf("%d%d",&n,&m); int q1,q2; 9 for(re int i=1;i<=m;++i) scanf("%d%d",&q1,&q2),d[q1][q2]=1; 10 for(re int k=1;k<=n;++k) 11 for(re int j=1;j<=n;++j) 12 for(re int i=1;i<=n;++i) 13 d[i][j]|=d[i][k]&d[k][j];//(i,k),(k,j)都要有关系,(i,j)才有关系 14 for(re int i=1;i<=n;++i){ 15 int tmp=1; 16 for(re int j=1;j<=n;++j) 17 if(i!=j) tmp&=d[i][j]|d[j][i];//是否与其他n-1个点都有关系 18 ans+=tmp; 19 }printf("%d",ans); 20 return 0; 21 }