标签:
。。
,N进行比赛,比赛结束后。裁判委员会要将全部參赛队伍从前往后依次排名,但如今裁判委员会不能直接获得每一个队的比赛成绩。仅仅知道每场比赛的结果,即P1赢P2,用P1。P2表示,排名时P1在P2之前。如今请你编程序确定排名。
输出时队伍号之间有空格,最后一名后面没有空格。
其它说明:符合条件的排名可能不是唯一的。此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
4 3 1 2 2 3 4 3
1 2 4 3
#include<iostream> #include<cstring> using namespace std; const int MAXN=500+10; int inDev[MAXN]; bool visited[MAXN]; bool g[MAXN][MAXN]; int n,m; void init() { memset(g,0,sizeof(g)); memset(visited,0,sizeof(visited)); memset(inDev,0,sizeof(inDev)); } void input() { int a,b; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); if(!g[a][b]) { g[a][b]=true; ++inDev[b]; } } } void topSort() { int i,tag=0; while(tag<n) { for(i=1;i<=n;i++) if(!visited[i]&&0==inDev[i]) break; if(tag) printf(" "); ++tag; printf("%d",i); visited[i]=true; for(int j=1;j<=n;j++) if(g[i][j]) --inDev[j]; } printf("\n"); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { init(); input(); topSort(); } return 0; }
2 1 1 2 2 2 1 2 2 1
1777 -1
#include<iostream> #include<vector> #include<cstring> #include<queue> using namespace std; const int MAXN=10000+10; vector<int>g[MAXN]; int inDev[MAXN]; int money[MAXN]; int n,m; void init() { for(int i=0;i<MAXN;i++) { g[i].clear(); money[i]=888; } memset(inDev,0,sizeof(inDev)); } void input() { int a,b; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); g[b].push_back(a); ++inDev[a]; } } void topSort() { queue<int>q; int tag=0,ans=0; for(int i=1;i<=n;i++) { if(inDev[i]==0) q.push(i); } while(!q.empty()) { ++tag; int now=q.front(); ans+=money[now]; q.pop(); for(int i=0;i<g[now].size();i++) { int next=g[now][i]; if(--inDev[next]==0) { q.push(next); money[next]=money[now]+1; } } } if(tag!=n) ans=-1; printf("%d\n",ans); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { init(); input(); topSort(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/lcchuguo/p/5207121.html