拓扑排序变形poj3687
来源:互联网 发布:辽宁联通云计算 编辑:程序博客网 时间:2024/05/21 13:22
题意为拓扑排序,使得小的结点尽可能的排在前面:
如:5->6->1; 4->3->2
应让结点1尽量排在前面,再使2尽量排在前面... ...:5 6 1 4 3 2
若直接按结点从小到大拓扑排序,无法得到正解:4 3 2 5 6 1
如:5->6->1; 4->3->2
应让结点1尽量排在前面,再使2尽量排在前面... ...:5 6 1 4 3 2
若直接按结点从小到大拓扑排序,无法得到正解:4 3 2 5 6 1
反向拓扑排序,按结点从大到小的顺序这样能使结点小的尽可能的排在后面:2 3 4 1 6 5,那么反过来的5 6 1 4 3 2就是所求的拓扑序列,再编上号:5(1),6(2),1(3),4(4),3(5),2(6)即可。
但是一般的拓扑排序只能处理标号字典序最小的方案,不能处理顺序下标字典序最小。
那么我们逆向思考一下下。我们让重量最大的给尽量编号大的节点,那么也就能实现让输出方案字典序最小了。
那么把整个图反向,然后按照从大到小的顺序进行拓扑排序,最终把每个点的重量输出即为最终答案。
#include<iostream>#include<cstdio>#include<stack>#include<vector>#include<cstring>#include<queue>using namespace std;const int maxn=260;int n,m,L,R;vector<int> v[maxn];int in[maxn];int ans[maxn],num;bool topological(){ priority_queue<int,vector<int>,less<int> > s; num=0; for(int i=1;i<=n;i++) if(in[i]==0)s.push(i); int cnt=0; while(!s.empty()) { int u=s.top();s.pop(); cnt++; ans[num++]=u; int len=v[u].size(); for(int i=0;i<len;i++) { int V=v[u][i]; in[V]--; if(in[V]==0)s.push(V); } } if(cnt<n)return false;//如果点的个数小于n说明存在环 return true;}int main(){ //freopen("in.txt","r",stdin); int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); memset(in,0,sizeof(in)); for(int i=0;i<=n;i++)v[i].clear(); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); v[y].push_back(x); in[x]++; } if(topological()) { int lab[maxn]; for(int i=0;i<num;i++)lab[ans[i]]=n-i; cout<<lab[1]; for(int i=2;i<=n;i++)cout<<" "<<lab[i]; } else cout<<-1; cout<<endl; } return 0;}
0 0
- 拓扑排序变形poj3687
- poj3687 图论 拓扑排序
- POJ3687-反向拓扑排序
- poj3687 拓扑排序
- poj3687【拓扑排序】
- POJ3687拓扑排序+贪心
- poj3687 Labeling Balls 拓扑排序
- [poj3687]拓扑排序的应用
- poj3687 Labeling Balls【拓扑排序】
- POJ3687 Labeling Balls逆拓扑排序
- poj3687反向建图+拓扑排序
- POJ3687 Labeling Balls (拓扑排序)经典
- [逆向拓扑排序]POJ3687 Labeling Balls
- POJ3687 Labeling Balls 特殊拓扑排序
- poj3687 反向建图拓扑排序
- poj3687 Labeling Balls (反向拓扑排序)
- poj3687~拓扑排序(附上拓扑排序详解)
- POJ3687 Labeling Balls(拓扑排序的应用)
- 泛型专题
- Linux下使用C/C++访问数据库——Oracle之OCI篇
- Vistavisurla
- mysql5.1---二进制日志binlog_format参数说明
- binder驱动-------之内存映射篇
- 拓扑排序变形poj3687
- 线性规划与网络流24题之餐巾计划问题 最小费用最大流
- 红黑树学习笔记
- 如何在mac中使用github
- oracle诊断事件
- 5-0. 求序列前N项和(15)
- 用C语言模拟随机数的生成
- btn 添加长按手势
- Android apiDemo 学习——对话框AlertDialogSamples