首页 > 代码库 > poj3687 拓扑排序 还没怎么搞明白 回头再想想
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 0x3f3f3f3f13 #define Inf 0x3FFFFFFFFFFFFFFFLL14 #define eps 1e-915 #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 else71 {72 printf("%d",ans[1]);73 for(i=2;i<=n;i++)74 printf(" %d",ans[i]);75 printf("\n");76 }77 }78 79 }
考虑这组数据:
25 41 44 25 33 25 31 44 23 5输出应该是:1 5 3 4 21 3 4 2 5
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。