博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解 拓扑排序 POJ 3687
阅读量:4538 次
发布时间:2019-06-08

本文共 1563 字,大约阅读时间需要 5 分钟。

题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小。(先保证1号球最轻,其次2号……)

分析:拓扑排序,注意根据题的要求,要先保证1号球最轻,如果我们由轻的向重的连边,然后我们依次有小到大每次把重量分给一个入度为0的点,那么在拓扑时我们面对多个入度为0的点,我们不知道该把最轻的分给谁才能以最快的速度找到1号(使1号入度为0),并把当前最轻的分给1号。所以我们要由重的向轻的连边,然后从大到小每次把一个重量分给一个入度为0的点。这样我们就不用急于探求最小号。我们只需要一直给最大号附最大值,尽量不给小号赋值,这样自然而然就会把轻的重量留给小号。注意重边。

代码

#include 
#include
#include
#include
using namespace std;#define maxn 205bool g[maxn][maxn];bool vis[maxn];int in[maxn];int ans[maxn];int n, m;void input(){ scanf("%d%d", &n, &m); memset(g, 0, sizeof(g)); memset(in, 0, sizeof(in)); for (int i =0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); a--; b--; if (!g[b][a]) in[a]++; g[b][a] =true; }}void work(){ memset(vis, 0, sizeof(vis)); for (int i = n; i >0; i--) { int q =-1; for (int j = n -1; j >=0; j--) if (!vis[j] &&in[j] ==0) { q = j; break; } if (q ==-1) { printf("-1\n"); return; } vis[q] =true; ans[q] = i; for (int j =0; j < n; j++) if (g[q][j]) in[j]--; } printf("%d", ans[0]); for (int i =1; i < n; i++) printf(" %d", ans[i]); putchar('\n');}int main(){ //freopen("t.txt", "r", stdin);int t; scanf("%d", &t); while (t--) { input(); work(); } return 0;}
注:摘自于网上,至今未能理解。。。

转载于:https://www.cnblogs.com/ghh1995/p/4349021.html

你可能感兴趣的文章
Kafka Producer相关代码分析【转】
查看>>
麻省理工学院公开课-第四讲:快速排序 及 随机化 算法
查看>>
pycharm 的包路径设置export PYTHONPATH=$PYTHONPATH
查看>>
SQL语句创建函数
查看>>
解决mysql无法显示中文/MySQL中文乱码问号等问题
查看>>
CentOS 7.2 配置mysql5.7
查看>>
python输出转义字符
查看>>
计算一个整数二进制中1的个数
查看>>
netdom join 错误:指定的域不存在,或无法联系。
查看>>
Android中Dialog的使用
查看>>
Android Activity接收Service发送的广播
查看>>
[Leetcode] Spiral Matrix | 把一个2D matrix用螺旋方式打印
查看>>
加速和监控国际网络
查看>>
【Flex】读取本地XML,然后XML数据转成JSON数据
查看>>
字符串循环右移-c语言
查看>>
解决从pl/sql查看oracle的number(19)类型数据为科学计数法的有关问题
查看>>
古训《增广贤文》
查看>>
职场的真相——七句话
查看>>
xcode命令行编译时:codesign命令,抛出“User interaction is not allowed.”异常 的处理...
查看>>
[转载]开机出现A disk read error occurred错误
查看>>