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++)//从小开始找
 15         {
 16             if(count[i]==0)//入读为0
 17             {
 18                 count[i]--;
 19                 seq[ff++]=i;
 20                 for(j=1;j<=n;j++)//相关的点减度
 21                     if(map[i][j])
 22                     {
 23                         count[j]--;
 24                     }
 25
 26                 break;
 27             }
 28         }
 29     }
 30     return 1;
 31 }
 32 int main()
 33 {
 34     int i,j,m;
 35     while(scanf("%d%d",&n,&m)!=EOF)
 36     {
 37         ff=0;
 38         memset(count,0,sizeof(count));
 39         memset(map,0,sizeof(map));
 40         for(i=0;i<m;i++)
 41         {
 42             int x,y;
 43             scanf("%d%d",&x,&y);
 44             if(map[x][y]==0)//重边
 45             {
 46                 map[x][y]=1;
 47                 count[y]++;//入读
 48             }
 49         }
 50         int ans=topo();
 51         if(ans)
 52         {
 53             for(i=0;i<ff;i++)
 54                 if(i==0)printf("%d",seq[i]);
 55                 else printf(" %d",seq[i]);
 56                 printf("\n");
 57         }
 58     }
 59 }
 60
 61
 62
 63
 64 /*模版
 65 #include<stdio.h>
 66 #include<string.h>
 67 int map[103][103],n,m;
 68 int c[103];
 69 int dfs(int u)
 70 {
 71     int i,j,l;
 72     c[u]=-1;
 73     for(i=0;i<n;i++)
 74         if(map[u][i])
 75         {
 76             if(c[i]<0)
 77                 return 0;
 78             else if(!c[i]&&!dfs(i))
 79                 return 0;
 80         }
 81     c[u]=1;
 82     return 1;
 83 }
 84 int topo()
 85 {
 86     int i,j;
 87     memset(c,0,sizeof(c));
 88     for(i=0;i<n;i++)
 89     {
 90         if(!c[i])
 91             if(!dfs(i))
 92                 return 0;
 93     }
 94     return 1;
 95 }
 96 int main()
 97 {
 98     int i,j,l;
 99     while(scanf("%d%d",&n,&m)!=EOF)
100     {
101         memset(map,0,sizeof(map));
102         if(!n)
103             break;
104         for(i=0;i<m;i++)
105         {
106             int a,b;
107             scanf("%d%d",&a,&b);
108             map[a][b]=1;
109         }
110         if(!topo())
111             printf("NO\n");
112         else printf("YES\n");
113     }
114 }*/
时间: 2024-12-21 16:15:28

hdu1285简单拓扑排序的相关文章

HDU-1285 简单拓扑排序

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 35253    Accepted Submission(s): 13787 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进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

POJ 2367Genealogical tree 简单拓扑排序

Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3358   Accepted: 2255   Special Judge Description The system of Martians' blood relations is confusing enough. Actually, Martians bud when they want and where they want. T

ZZUOJ - 1199 - 大小关系 (拓扑排序!)

1199: 大小关系 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 126  Solved: 27 [Submit][Status][Web Board] Description 当我们知道一组大小关系之后,可判断所有关系是否都能成立,即关系间没有矛盾. 例如:A<B, A<C, B<C  通过这组关系我们可以得到A<B<C ,所有关系都成立,没有矛盾. 若 A<B, B<C, C<A  通过前两个关系我们得

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进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

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进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

拓扑排序的简单证明以及由来

介绍 拓扑排序,很多人都可能听说但是不了解的一种算法.或许很多人只知道它是图论的一种排序,至于干什么的不清楚.又或许很多人可能还会认为它是一种啥排序.而实质上它是对有向图的顶点排成一个线性序列. 至于定义,百科上是这么说的: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological O

hdu1285(拓扑排序)

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