链接:
http://poj.org/problem?id=3660
思路:
1. 1->2->3==1->3
2. 记录每次的比赛人员
3. 每个人只能跟他序号不同的人比赛,因此他最多比了n-1场比赛
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> #include<vector> using namespace std; #define N 110 #define INF 0xfffffff int n, m; int G[N][N], f[N][N], d[N]; void IN() { memset(f, false, sizeof(f)); memset(d, 0, sizeof(d)); for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) { G[i][j]=G[j][i]=INF; } } void Floyd() { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(k!=i && k!=j && i!=j && !G[i][k] && !G[k][j]) { if(!f[i][j]) { G[i][j]=0; f[i][j]=1; d[i]++; d[j]++; } } } } int main() { while(scanf("%d%d", &n, &m)!=EOF) { int i, a, b; IN(); for(i=0; i<m; i++) { scanf("%d%d", &a, &b); G[a][b]=0; f[a][b]=1; d[a]++;d[b]++; } Floyd(); int sum=0; for(i=1; i<=n; i++) { if(d[i]==n-1) sum++; } printf("%d ", sum); } return 0; }