poj 3660 Cow Contest
看了题解才知道,原来floyd不止是用来求最短路的......
用floyd,如果i和j有关则a[i][j]=1,否则为-1;
能得出一个点的绝对排名的充要条件是这个点和其他每个点都有关(直接或间接)。
最后遍历每一个点,如果存在一个点和这个点没有关系,那么这个点就是一个无关点,最后用n-无关点个数就是答案。
1 #include <iostream> 2 #include<stdio.h> 3 #include<cstring> 4 using namespace std; 5 int a[105][105];//表示两者间是否有关,1有关,-1无关 6 int n,m; 7 void floyd(){ 8 for(int i=1;i<=n;i++) 9 for(int j=1;j<=n;j++) 10 for(int k=1;k<=n;k++){ 11 if(a[j][k]==-1&&a[j][i]+a[i][k]>0) 12 a[j][k]=1; 13 } 14 } 15 16 int main() 17 { 18 int count=0; 19 memset(a,-1,sizeof(a)); 20 for(int i=1;i<=n;i++) 21 a[i][i]=1; 22 scanf("%d %d",&n,&m); 23 for(int i=1;i<=m;i++){ 24 int temp1,temp2; 25 scanf("%d %d",&temp1,&temp2); 26 a[temp1][temp2]=1; 27 } 28 floyd(); 29 for(int i=1;i<=n;i++) 30 for(int j=1;j<=n;j++){ 31 if(i==j) continue; 32 if((a[i][j]==-1)&&(a[j][i]==-1)) { 33 count++; 34 break; 35 } 36 } 37 printf("%d\n",n-count); 38 return 0; 39 }