HDU 1285-确定比赛名次(拓扑排序)
2017-07-22 09:59
465 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285
确定比赛名次
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 27303 Accepted Submission(s): 10919
Problem Description
有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
Input
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。
Output
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
Sample Input
4 3
1 2
2 3
4 3
Sample Output
1 2 4 3
//简单的拓扑排序, 31ms #include <stdio.h> #include <string.h> #define maxn 505 bool vit[maxn][maxn]; //存图 int deg[maxn]; //入度 void toposort(int n) { for(int i=1; i<=n; i++) { int u; for(int j=1; j<=n; j++) { if(deg[j]==0) { deg[j]--; u = j; if(i!=n) { printf("%d ", u); } else printf("%d\n", u); break; } } for(int j=1; j<=n; j++) { if(vit[u][j]) { deg[j]--; } } } } int main() { int N, M; while(~scanf("%d%d", &N, &M)) { memset(vit, false, sizeof(vit)); memset(deg, 0, sizeof(deg)); for(int i=0; i<M; i++) { int a, b; scanf("%d%d", &a, &b); //如果被同一个人打败多次, 则只记录一个 if(!vit[a][b]) { vit[a][b] = true; deg[b]++; } } toposort(N); } return 0; }
//用优先队列优化, 15ms
//用优先队列实现拓扑排序 #include <stdio.h> #include <string.h> #include <queue> #include <vector> #include <algorithm> #define maxn 505 using namespace std; int deg[maxn]; vector<int>vec[maxn]; void toposort(int n) { priority_queue<int, vector<int>, greater<int> >q; while(!q.empty()) q.pop(); for(int i=1; i<=n; i++) if(deg[i]==0) { q.push(i); deg[i]--; } int k = 1; while(!q.empty()) { int u = q.top(); q.pop(); int l = vec[u].size(); printf("%d%c", u, k++ == n ? '\n' : ' ');//输出 for(int i=0; i<l; i++) { deg[vec[u][i]]--; if(deg[vec[u][i]]==0) q.push(vec[u][i]); } } } int main() { int N, M; while(scanf("%d%d", &N, &M)!=EOF) { for(int i=0; i<maxn; i++) { vec[i].clear(); deg[i] = 0; } for(int i=0; i<M; i++) { int a, b; scanf("%d%d", &a, &b); vector<int>::iterator it; it = find(vec[a].begin(), vec[a].end(), b); if(it==vec[a].end()) { vec[a].push_back(b); deg[b]++; } } toposort(N); } return 0; }
相关文章推荐
- hdu 1285 确定比赛名次 拓扑排序 解题报告
- hdu 1285 确定比赛名次(拓扑排序)
- 拓扑排序 HDU 1285 确定比赛名次
- HDU-#1285 确定比赛名次(拓扑排序)
- hdu 1285 确定比赛名次(拓扑排序)
- HDU 1285 确定比赛名次(拓扑排序)
- HDU 1285 确定比赛名次【拓扑排序】
- HDU 1285--确定比赛名次【拓扑排序 && 邻接表实现】
- hdu 1285 确定比赛名次 (浙大拓扑排序模板)
- hdu 1285 确定比赛名次(拓扑排序)
- HDU - 1285 确定比赛名次 —— 拓扑排序
- HDU 1285 确定比赛名次【拓扑排序】
- 拓扑排序(Topological Order 基础篇)—— 确定比赛名次 (HDU 1285 )
- 【HDU - 1285 确定比赛名次】 拓扑排序
- HDU - 1285 确定比赛名次 &&UVA - 10305 Ordering Tasks (拓扑排序)
- HDU 1285 确定比赛名次(拓扑排序)
- HDU 1285 确定比赛名次(拓扑排序基础)
- 确定比赛名次,hdu 1285 最简单的拓扑排序,
- hdu 1285 确定比赛名次 拓扑排序
- HDU 1285 确定比赛名次 拓扑排序