标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17294 Accepted Submission(s): 6888
4 3 1 2 2 3 4 3
1 2 4 3
<span style="font-size:12px;">#include<cstdio> #include<cstring> int ans[510][510];//记录两人是否进行了比赛 int n,indegree[510];//记录前驱个数 int queue[510];//保存拓扑 void tuopu() { int i,j,top,k=0; for(j=0;j<n;++j) { for(i=1;i<=n;++i) { if(indegree[i]==0)//前驱为零即是当前第一名 { top=i; break; } } queue[k++]=top;//当前第一名入队列 indegree[top]=-1;//前驱数量更新为-1,避免重复入队列 for(i=1;i<=n;++i) { if(ans[top][i])//将前驱中含有当前第一名的前去数量减一 indegree[i]--; } } for(i=0;i<k-1;++i) printf("%d ",queue[i]); printf("%d\n",queue[n-1]); } int main() { int i,a,b,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(indegree,0,sizeof(indegree)); memset(ans,0,sizeof(ans)); for(i=0;i<m;++i) { scanf("%d%d",&a,&b); if(ans[a][b]==0) { ans[a][b]=1;//记录是否进行了比赛 indegree[b]++;//记录前驱数量 } } tuopu(); } return 0; }</span>
<span style="font-size:12px;">#include<cstdio> #include<cstring> int n,indegree[510]; int queue[510],head[510]; struct node { int to,next; }ans[510]; void tuopu() { int i,j,top,k=0,cnt; for(j=0;j<n;++j) { for(i=1;i<=n;++i) { if(indegree[i]==0) { top=i; break; } } queue[k++]=top; indegree[top]=-1; for(cnt=head[top];cnt!=-1;cnt=ans[cnt].next)//邻接表,看不懂,可以找数据模拟几遍 indegree[ans[cnt].to]--; } for(i=0;i<n-1;++i) printf("%d ",queue[i]); printf("%d\n",queue[n-1]); } int main() { int i,a,b,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(indegree,0,sizeof(indegree)); memset(head,-1,sizeof(head)); for(i=0;i<m;++i) { scanf("%d%d",&a,&b); ans[i].to=b;//建表 ans[i].next=head[a]; head[a]=i; indegree[b]++; } tuopu(); } return 0; }</span>
<span style="font-size:12px;">#include<cstdio> #include<cstring> #include<queue> using namespace std; int ans[510][510]; int n,indegree[510]; void tuopu() { int i,j,t,top; queue<int>q; for(i=1;i<=n;++i) { if(indegree[i]==0) { q.push(i); break; } } int sign=1; while(!q.empty()) { top=q.front(); q.pop(); indegree[top]=-1; if(sign) { printf("%d",top); sign=0; } else printf(" %d",top); for(i=1;i<=n;++i)//注意,以当前第一名为前驱的点的前驱数量都要减少 { if(ans[top][i]==1) indegree[i]--; } for(i=1;i<=n;++i) { if(indegree[i]==0) { q.push(i); break; } } } printf("\n"); } int main() { int i,m,a,b; while(scanf("%d%d",&n,&m)!=EOF) { memset(indegree,0,sizeof(indegree)); memset(ans,0,sizeof(ans)); for(i=0;i<m;++i) { scanf("%d%d",&a,&b); if(ans[a][b]==0) { ans[a][b]=1; indegree[b]++; } } tuopu(); } return 0; }</span>
<span style="font-size:12px;">#include<cstdio> #include<cstring> #include<queue> using namespace std; int ans[510][510]; int n,indegree[510]; void tuopu() { int i,j,t,top; priority_queue<int,vector<int>,greater<int> >q;//从小到大排序 for(i=1;i<=n;++i) { if(indegree[i]==0) q.push(i); } int sign=1; while(!q.empty()) { top=q.top(); q.pop(); indegree[top]=-1; if(sign) { printf("%d",top); sign=0; } else printf(" %d",top); for(i=1;i<=n;++i) { if(ans[top][i]) { indegree[i]--; if(indegree[i]==0) q.push(i); } } } printf("\n"); } int main() { int i,m,a,b; while(scanf("%d%d",&n,&m)!=EOF) { memset(indegree,0,sizeof(indegree)); memset(ans,0,sizeof(ans)); for(i=0;i<m;++i) { scanf("%d%d",&a,&b); if(ans[a][b]==0) { ans[a][b]=1; indegree[b]++; } } tuopu(); } return 0; }</span>
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/zwj1452267376/article/details/47663635