此题想法挺巧妙的,用folyd算出距离,如果map[i][j]不是INF的话就说明i,j之间有关系,如果是INF就是没关系,如果map[i][j],map[j][i]都是INF,说明i与j没有任何直接边或者间接边相连,那么说明他们之间是完全没关系,那就说这两个数的位置完全无法确定。
// // main.cpp // Richard // // Created by 邵金杰 on 16/8/15. // Copyright © 2016年 邵金杰. All rights reserved. // #include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<cstring> using namespace std; const int maxn=100+5; const int INF=10000000; int map[maxn][maxn]; int N,M; void folyd() { for(int k=1;k<=N;k++) { for(int i=1;i<=N;i++) { for(int j=1;j<=N;j++) { map[i][j]=min(map[i][j],map[i][k]+map[k][j]); } } } } void check() { int vis[maxn]; vector<int> v; memset(vis,0,sizeof(vis)); for(int i=1;i<=N;i++) { for(int j=1;j<=N;j++) { if(map[i][j]==INF&&map[j][i]==INF) { if(!vis[i]) {vis[i]=1;v.push_back(i);} if(!vis[j]) {vis[j]=1;v.push_back(j);} } } } printf("%d\n",N-(int)v.size()); } int main() { while(scanf("%d%d",&N,&M)!=EOF) { int s,e; for(int i=1;i<=N;i++) { for(int j=1;j<=N;j++) { if(i==j) map[i][j]=0; else map[i][j]=INF; } } for(int i=0;i<M;i++) { scanf("%d%d",&s,&e); map[s][e]=1; } folyd(); check(); } return 0; }