poj3687 拓扑排序 还没怎么搞明白 回头再想想

【题意】:n个重量为1~n的球,给定一些球之间的重量比较关系(如 2 1  表示第二个球比第一个球轻),求每个球可能的重量,ans[i] 表示第i个球的重量,要求输出的是ans字典序最小的情况。

【思路】:对于给出的a b  建反边,每次 在出度为0的所有点里选一个序号最小的赋值(从n开始 由大到小赋)。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 #include<map>
 7 #include<queue>
 8 #include<stack>
 9 #include<set>
10 #include<cmath>
11 #include<vector>
12 #define inf 0x3f3f3f3f
13 #define Inf 0x3FFFFFFFFFFFFFFFLL
14 #define eps 1e-9
15 #define pi acos(-1.0)
16 using namespace std;
17
18 int in[202],ans[202];
19 bool g[202][202],vis[202];
20 priority_queue<int>q;
21
22 int main()
23 {
24     int i,t,j,n,m,a,b;
25     scanf("%d",&t);
26     while(t--)
27     {
28        //getchar();
29         scanf("%d%d",&n,&m);
30         memset(in,0,sizeof(in));
31         memset(g,false,sizeof(g));
32         memset(vis,false,sizeof(vis));
33         while(m--)
34         {
35             scanf("%d%d",&a,&b);
36             if(g[b][a])
37                 continue;
38             g[b][a]=true;
39             in[a]++;
40         }
41         for(i=1;i<=n;i++)
42             if(in[i]==0)
43                 {
44                     q.push(i);
45                     vis[i]=true;
46                 }
47         int num=n;
48         for(i=0;i<n;i++)//每次一个出度为0的序号最小的
49         {
50             int temp;
51             if(q.empty())
52                 break;
53             temp=q.top();q.pop(); //printf("i  %d \n",temp);
54             ans[temp]=num--;
55             for(int j=1;j<=n;j++)
56                 if(j!=temp&&g[temp][j])
57                 {
58                     in[j]--;
59                     if(in[j]==0&&!vis[j])
60                        {
61                            q.push(j);
62                            vis[j]=true;
63                        }
64                 }
66         }
67         //printf("ans    ");
68         if(i<n)
69             printf("-1\n");
70         else
71         {
72             printf("%d",ans[1]);
73             for(i=2;i<=n;i++)
74                 printf(" %d",ans[i]);
75             printf("\n");
76         }
77     }
78
79 }

考虑这组数据:

2

5 4
1 4
4 2
5 3
3 2

5 3
1 4
4 2
3 5

输出应该是:
1 5 3 4 2
1 3 4 2 5

poj3687 拓扑排序 还没怎么搞明白 回头再想想

时间: 2024-08-04 16:15:05

poj3687 拓扑排序 还没怎么搞明白 回头再想想的相关文章

poj3687拓扑排序

反向建图 #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <set> #include &

poj 2367 拓扑排序

题目链接:http://poj.org/problem?id=2367 题目大意:就是进行拓扑排序,先给你一个数n,代表1~n,对于每个数有一系列的指向,最后将这些数进行排列出来..就是简单的拓扑排序. 首先拓扑排序应该有两种实现的方法.. 一种是用dfs进行每个节点的搜索,最后进行回溯,这样的话很容易就能明白先找出来的应该是后面的数,而最后找出来的应该是之前的数,因为是回溯出来的嘛..所以可以使用一个栈来进行答案的存储,因为栈的特性就是后压入的先弹出. dfs实现的思想:利用一个数组来存储每个

hdu 1811(拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7961    Accepted Submission(s): 2266 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为 了更好的符合那些爱好者的喜好,Lele又想

【图论】拓扑排序应用

拓扑排序虽是一种排序,但是它跟平时所接触的sort或者qsort不同,排序的意义不同.拓扑排序针对有向无回路图(DAG)而言的,不应用与存在回路的有向图. [图论]广度优先搜索和深度优先搜索 有说到了BFS和DFS,拓扑排序是DFS的一个应用. 有向无回路图能说明事件的发生的先后的顺序.比如穿衣服,士兵排队等.一个具体的例子,有N个物体,下面给出物体的重量比较,比如(a,b)表示a比b重等等,问已给出的条件是否会矛盾?其实就是判断用所给条件所组织的一个图中是否会存在环? 在DFS中加入时间戳,完

拓扑排序(Topological Sorting)

一.什么是拓扑排序 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列.且该序列必须满足下面两个条件: 每个顶点出现且只出现一次. 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 例如,下面这个图: 它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法: 从 DAG

ACM: hdu 2647 Reward -拓扑排序

hdu 2647 Reward Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to distribute rewards to his workers. Now he has a trouble

ACM/ICPC 之 拓扑排序-反向(POJ3687)

难点依旧是题意....需要反向构图+去重+看题 POJ3687-Labeling Balls 题意:1-N编号的球,输出满足给定约束的按原编号排列的重量序列,如果有多组答案,则输出编号最小的Ball重量最轻,若依旧多组则输出编号次小的Ball重量最轻的方案. 题解:在看懂题意后,再开始做会省很多时间...曲解题意还真是人类的本能啊. 为了完成单向关系排序,需要用到拓扑排序: 为了符合编号最小的重量最轻...的题意,需要用到反向拓扑排序: 输入可能会有重复的关系,因此需要判重: 输出需要按原编号输

Labeling Balls POJ3687 【拓扑排序反向建边】【邻接表】

http://poj.org/problem?id=3687 Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N in such a way that: No two balls share the same label. The labeling satisfies several constrains like "The

谁是网络文学搅局者不重要,IP能不能变现还没闹明白呢

不管BAT们各自在版权上使用怎么样的模式来笼络网络文学的创作者们,它们的核心思路其实都是一样的:即围绕知识产权,打通文学.游戏.影视等泛娱乐产业链 文/张书乐 刊载于<法人>杂志2015年7月刊 据媒体近日报道,阿里文学首次召开战略发布会,宣布将以移动阅读为突破口,推出开放版权战略,还与多家内容商达成战略合作,正式吹响大力进军网络文学市场的号角. 至此,百度.阿里巴巴.腾讯这三家被称之为"BAT"的互联网三巨头,继前不久在车联网领域聚首后,再一次在网络文学领域碰了个照面.