链接:点击打开链接
题意:输入N,M,N代表N个数,M代表M个关系,输入P1,P2,代表P1胜P2,即排名时P1排在P2前面,输出最后排名顺序,因为答案可能不唯一,输出时编号小的队伍在前
代码1:
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #include <queue> #include <vector> using namespace std; struct cmp{ bool operator()(int a,int b){ return a>b; } }; int n,m; int s[505],prefix[505]; vector<int>v[505]; void toposort(){ int i,u,k; //拓扑排序模板,用STL建图,因为是按队伍编号小的在前,因此用到优先队列 priority_queue<int,vector<int>,cmp>q; for(i=1;i<=n;i++) if(!prefix[i]) q.push(i); k=0; while(q.size()){ u=q.top();q.pop(); s[k++]=u; for(i=0;i<v[u].size();i++){ //遍历u这个点所连的所有点 prefix[v[u][i]]--; if(prefix[v[u][i]]==0) q.push(v[u][i]); } } } int main(){ int i,a,b; while(scanf("%d%d",&n,&m)!=EOF){ for(i=0;i<=n;i++){ v[i].clear(); //初始化 prefix[i]=0; } for(i=0;i<m;i++){ cin>>a>>b; v[a].push_back(b); prefix[b]++; } for(i=1;i<=n;i++) sort(v[i].begin(),v[i].end()); toposort(); for(i=0;i<n;i++){ if(i==n-1) printf("%d\n",s[i]); else printf("%d ",s[i]); } } return 0; }代码2:
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int rel[505][505],prefix[505]; int s[505]; int n,m; void toposort(){ int i,j,p,k; k=1; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ if(prefix[j]==0){ s[k++]=j; prefix[j]--; for(p=1;p<=n;p++) if(rel[j][p]==1) prefix[p]--; break; } } } int main(){ //用数组模拟,二维数组记录两个点关系 int a,b; //但是这种方法只能用于数据小的情况,数据大时开不了特别大的二维数组 int i; while(cin>>n>>m){ memset(rel,0,sizeof(rel)); memset(prefix,0,sizeof(prefix)); memset(s,0,sizeof(s)); for(i=1;i<=m;i++){ cin>>a>>b; if(!rel[a][b]){ rel[a][b]=1; prefix[b]++; } } toposort(); for(i=1;i<=n;i++){ if(i==n) printf("%d\n",s[i]); else printf("%d ",s[i]); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/stay_accept/article/details/47728317