码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-06 18:43:21      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   数据   for   ar   

【题意】: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 拓扑排序 还没怎么搞明白 回头再想想,布布扣,bubuko.com

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

标签:style   blog   color   os   io   数据   for   ar   

原文地址:http://www.cnblogs.com/assult/p/3895050.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!