题目81:确定比赛名次
2013-02-05 21:37
363 查看
//http://ac.jobdu.com/problem.php?cid=1040&pid=80
#include <stdio.h> #include <vector> #include <queue> using namespace std; vector<int> edge[501]; queue<int> Q; bool mark[501]; //标记已排序过的结点,因为多种情况下要保证顺序输出 int main() { int n,m,i; int inDegree[501]; while (scanf("%d%d",&n,&m)!=EOF) { while (!Q.empty()) { Q.pop(); } for (i=1;i<=n;i++) { inDegree[i]=0; mark[i]=false; edge[i].clear(); } while (m--) { int a,b; scanf("%d%d",&a,&b); edge[a].push_back(b); inDegree[b]++; } for (i=1;i<=n;i++) { int k=0; if (inDegree[i]==0) { Q.push(i); //第一个入度为0的点进队(保证号小者在队首) k++; if (k==1) { break; } } } int cnt=0; while (!Q.empty()) { int nowP=Q.front(); Q.pop(); cnt++; mark[nowP]=true; if (cnt!=n) { printf("%d ",nowP); } else printf("%d\n",nowP); for (i=0;i<edge[nowP].size();i++) //vector[i][j] j从0到vector[i].size-1 { inDegree[ edge[nowP][i] ]--; //将当前结点的伙计结点入度-- } for (i=1;i<=n;i++) //为保证顺序,每次再从头找第一个入度为0结点 { int k=0; if (mark[i]==true) { continue; //已排序的,跳过 } if (inDegree[i]==0) { Q.push(i); //第一个入度为0的点进队(保证号小者在队首) k++; if (k==1) { break; } } } } } return 0; }
相关文章推荐
- 九度 题目1449:确定比赛名次
- 题目1449:确定比赛名次
- Jobdu 题目1449:确定比赛名次
- 九度题目1449:确定比赛名次
- HDOJ题目1285确定比赛名次(拓扑排序,模板)
- 题目1449:确定比赛名次
- 九度 题目1449:确定比赛名次
- 九度题目1449:确定比赛名次
- 题目1449:确定比赛名次
- 九度 题目1449:确定比赛名次
- HDU 1285 确定比赛名次(第一个拓扑排序题目)
- 题目1449:确定比赛名次
- 九度 题目1449:确定比赛名次
- 题目1449:确定比赛名次(拓扑排序问题)
- HDU1285——确定比赛名次
- HDU 1285 确定比赛名次
- 确定比赛名次——拓扑排序
- HDU_1285_确定比赛名次(拓扑排序)
- hdu 1285 确定比赛名次(很典型的拓扑排序)
- 确定比赛名次