POJ 3660 Cow Contest
Floyd-Washall
const int MAX_N = 103;
const int INF = 0x3fffffff;
int N,M;
int W[MAX_N][MAX_N];
int D[MAX_N][MAX_N];
int tmpD[MAX_N][MAX_N];
void floyd(){
// D_0 = W
memcpy(D,W,sizeof(D));
for(int k=1;k<=N;k++){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
tmpD[i][j] = min(D[i][j],D[i][k]+D[k][j]);
}
}
memcpy(D,tmpD,sizeof(D));
}
}
int main(){
scanf("%d %d",&N,&M);
/* initialize W:
* w_ij = 0 i=j
* = 有向边(i,j)的权重 i≠j且(i,j) in E
* = INF i≠j且(i,j) not in E
*/
fill(W[0],W[0]+MAX_N*MAX_N,INF);
for(int i=1;i<=N;i++) W[i][i]=0;
for(int m=0;m<M;m++){
int A,B;
scanf("%d %d",&A,&B);
W[A][B] = 1;
}
floyd();
int ans=0;
for(int i=1;i<=N;i++){
int cnt=0;
for(int j=1;j<=N;j++){
if(D[i][j]!=0 && D[i][j]<INF) cnt++;
if(D[j][i]!=0 && D[j][i]<INF) cnt++;
}
if(cnt==N-1) ans++;
}
printf("%d
", ans);
}