HDU1285

题目

分析:将先后关系看成边,最后求出字典序最小的拓扑序列

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 using namespace std;
 6 const int maxn=550;
 7 int g[maxn][maxn];  //记录是否存在边
 8 int res[maxn];  //记录拓扑序列
 9 int edge[maxn];  //记录入度
10 int n,m;
11 void topo(){
12     for(int i=1;i<=n;i++){
13         for(int j=1;j<=n;j++){
14             if(g[i][j])
15                 edge[j]++;
16         }
17     }
18     for(int i=1;i<=n;i++){
19         int k=1;
20         while(edge[k]!=0) k++;
21         res[i]=k;
22         edge[k]=-1;
23         for(int j=1;j<=n;j++)
24             if(g[k][j])
25                 edge[j]--;
26     }
27 }
28 int main()
29 {
30     while(cin>>n>>m)
31     {
32         memset(g,0,sizeof(g));
33         memset(res,0,sizeof(res));
34         memset(edge,0,sizeof(edge));
35         for(int i=0;i<m;i++){
36             int x,y;
37             scanf("%d%d",&x,&y);
38             g[x][y]=1;
39         }
40         topo();
41         for(int i=1;i<n;i++)
42             printf("%d ",res[i]);
43         printf("%d\n",res[n]);
44     }
45 }

时间: 2024-08-27 04:53:55

HDU1285的相关文章

hdu--1285 &amp;&amp; 4857 --正向 || 逆向拓扑排序 &amp;&amp; 优先队列

头太晕了 喝了太多 .. 就想提一点 对于 拓扑排序的这2题 为什么一个是正向 一个是逆向 主要是看题目要求  因为拓扑排序的结果总是有很多种存在的 一般来说 它会让你输出它指定要求的形式的答案 那么 如果是按字典序输出 就是 greater<int> 情况下的优先队列 并且 正向 如果是尽量使小的数字 靠前输出 而不是追求 字典序 可以考虑 逆向拓扑 逆向输出 但 这些都不是唯一的 一定要分析好题目 曾经 看过一个讲动态规划的word  说拓扑是为DP作准备的 似乎有点道理 这两题 代码 实

HDU1285 确定比赛名次 【拓扑排序】

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11937    Accepted Submission(s): 4753 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

hdu1285+hdu2467(拓扑排序)

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10604    Accepted Submission(s): 4150 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

hdu1285(拓扑排序)

这道题要求没有输赢关系的两个元素必须按照升序输出,有输赢关系的,赢得在输的前面,所以用队列或者栈来降低时间复杂度的优化过的拓扑排序会出错. 比如这组输入 5 3 1 2 2 3 4 5 至少我写的两种拓扑排序都wa了.但是不用队列或者栈来优化的话, 1.每次都从头至尾扫描一遍,找到一个没标记过的节点, 2.将它标记 3.然后删除从它出来的每条边. 重复这三个操作,加标记的次序,就是题目要的答案. 下面的代码中用到了队列,但只是用来保存答案而已.并没有用它优化的意思. #include <iost

hdu1285 拓扑排序

思路: 选择一个入度为0的顶点并输出,从网中删除此顶点及所有出边. 循环结束后,若输出的定点数小于网中的顶点数,则输出有回路信息,否则输出的顶点就是一种拓扑序列. 具体实现方法:邻接表,时间复杂度较小,邻接矩阵,时间复杂度高 确定比赛名次 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,

hdu1285 确定比赛名次 (拓扑排序)

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16782    Accepted Submission(s): 6659 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

hdu1285简单拓扑排序

1 //hdu 1285 2 3 #include<stdio.h> 4 #include<string.h> 5 #include<stack> 6 using namespace std; 7 int map[600][600],n,count[600],seq[600],ff; 8 int topo() 9 { 10 int i,j; 11 ff=0; 12 while(ff<n)//当为排完 13 { 14 for(i=1;i<=n;i++)//从小

HDU1285 确定比赛名次【拓扑排序】【优先队列】

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13215    Accepted Submission(s): 5291 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

拓扑排序 HDU1285

这个题是个模板题,可以直接用拓扑排序的模板来做, AC代码 #include <stdio.h> #include<iostream> #include <string.h> using namespace std; const int N = 1000; int n, m; int Map[N][N]; int topNum[N]; bool toposort(int *ret) { int Indegree[N]; memset(Indegree, 0, sizeo

hdu1285拓扑排序

1 #include "iostream" 2 #include "vector" 3 #include "memory.h" 4 #include "cstdio" 5 using namespace std; 6 #define swap(a,b,t) ( (t) = (x),(x) = (y),(y) = (t) ) 7 #define MAXN 510 8 int G[MAXN][MAXN]; 9 int indegr