http://poj.org/problem?id=3660
图论,最短路,floyd
1 #include <stdio.h> 2 #define N 123 3 4 const int inf = 1<<29; 5 int n, g[N][N]; 6 7 int min(int x, int y) 8 { 9 return x<y? x: y; 10 } 11 12 void floyd() 13 { 14 for(int k=1; k<=n; k++) 15 { 16 for(int i=1; i<=n; i++) 17 { 18 for(int j=1; j<=n; j++) 19 { 20 g[i][j] = min(g[i][j], g[i][k]+g[k][j]); 21 } 22 } 23 } 24 } 25 26 int main() 27 { 28 int m, r, i, j, x, y, flag; 29 scanf("%d%d", &n, &m); 30 for(i=1; i<=n; i++) 31 { 32 for(j=1; j<=n; j++) 33 { 34 g[i][j] = inf; 35 } 36 } 37 for(i=1; i<=m; i++) 38 { 39 scanf("%d%d", &x, &y); 40 g[x][y] = 1; 41 } 42 floyd(); 43 r = 0; 44 for(i=1; i<=n; i++) 45 { 46 flag = 0; 47 for(j=1; j<=n; j++) 48 { 49 if(j != i) 50 { 51 if(g[i][j] == inf && g[j][i] == inf) 52 { 53 flag = 1; 54 break; 55 } 56 } 57 } 58 if(flag == 0) 59 { 60 //printf("%d\n", i); 61 r ++; 62 } 63 } 64 printf("%d\n", r); 65 return 0; 66 }