POJ 3687 逆序拓扑
额。题目大意:有N个球。编号和重量都是唯一不重复的。然后。给你m个pair a和b,表示编号为a的点一定比编号为b的点轻。然后捏、输出每个点对应的重量。关键是要求。如果有多种可能性的话,输出让序号小的点重量也尽量小的ans....而且先满足1号。再二号。and so on....那么问题来了。如果我们按照编号从小到大开始拓扑、然后每次对编号小的球赋给当前最小重量的话。T_T。貌似无法保证所有的球从小到大开始编号小则重量尽量小、比如说、第一次 入度为0得点有3 4 5 那么赋给了3重量1.第二次入度为0的点有2 4 5.那么。只能赋给2重量2了。如果再下次是4 5的话、赋给4 号球 重量3、再下次是1 5.赋给1号球重量4.但实际上这说明4——>1、而3 4 5 是并列关系。那就是先满足4的话就可以让1号球最小喽。恩。。是这样滴、、、
代码也灰常简单。就是按照入度为0的点的顺序来。貌似这就是拓扑排序。。2333333333333好吧。。我是很无知地。。。以为拓扑排序一定会用到邻接表形式。加一条边的insert函数。、T_T
附代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#define maxn 210
#define maxm 41000
using namespace std;
int digree[maxn];
int map[maxn][maxn];
int ans[maxn];
int vis[maxn];
int n, m;
void init()
{
memset(digree, 0, sizeof(digree));
memset(map, 0, sizeof(map));
memset(vis, 0, sizeof(vis));
}
void topsort()
{
for (int i=n; i>=1; --i)
{
int k = -1;
for (int j=n-1; j>=0; --j)
{
if (!vis[j] && digree[j] == 0)
{
k = j;
break;
}
}
if (k == -1)
{
cout << "-1\n";
return;
}
vis[k] = 1;
ans[k] = i;
for (int j=0; j<n; ++j)
{
if (map[k][j])
digree[j]--;
}
}
cout << ans[0];
for (int i=1; i<n; ++i)
{
cout << ' ' << ans[i];
}
cout << endl;
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n >> m;
init();
for (int i=0; i<m; ++i)
{
int a, b;
cin >> a >> b;
a--; b--;
if (!map[b][a])
{
map[b][a] = 1;
digree[a]++;
}
}
topsort();
}
return 0;
}
POJ 3687 逆序拓扑的更多相关文章
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10161 Accepted: 2810 D ...
- poj 3687 Labeling Balls(拓扑排序)
题目:http://poj.org/problem?id=3687题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号球最轻 ...
- Labeling Balls POJ - 3687 优先队列 + 反向拓扑
优先队列 + 反向拓扑 //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include ...
- H - Buy Tickets POJ - 2828 逆序遍历 树状数组+二分
H - Buy Tickets POJ - 2828 这个题目还是比较简单的,其实有思路,不过中途又断了,最后写了一发别的想法的T了. 然后脑子就有点糊涂,不应该啊,这个题目应该会写才对,这个和之前的 ...
- poj 3687 Labeling Balls【反向拓扑】
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12246 Accepted: 3508 D ...
- POJ 1840 Brainman(逆序对数)
题目链接:http://poj.org/problem?id=1804 题意:给定一个序列a[],每次只允许交换相邻两个数,最少要交换多少次才能把它变成非递降序列. 思路:题目就是要求逆序对数,我们知 ...
- POJ 2541 Binary Witch(逆序KMP,好题)
逆序KMP,真的是强大! 参考链接,下面有题意解释:http://blog.sina.com.cn/s/blog_6ec5c2d00100tphp.htmlhttp://blog.csdn.net/s ...
- (字符串的处理4.7.16)POJ 1159 Palindrome(让一个字符串变成回文串需要插入多少个字符...先逆序,在减去公共子序列的最大长度即可)
/* * POJ_1159.cpp * * Created on: 2013年10月29日 * Author: Administrator */ #include <iostream> # ...
- poj 2828 Buy Tickets【线段树单点更新】【逆序输入】
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 16273 Accepted: 8098 Desc ...
随机推荐
- 图--DFS求连通块
The GeoSurvComp geologic survey company is responsible for detecting u ...
- JavaScript算法题之–随机数的生成
JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2 ...
- c++ 爬虫
这是一个简单的c++爬虫,效率并不是很高... #include<stdio.h> ],s2[]; void fun(int a, int b) { int i,ii; bool t1,t ...
- 笔记本_thinkpad_e40_FN
1. 开机时按F10进入bios 然后在 bios 中选择 system configuration,看一下其中的 action keys mode .如果此选项后面为 enable 的话,是不需要按 ...
- 树的计数 + prufer序列与Cayley公式 学习笔记
首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682 然后是morejarphone同学的博文:http://blog.csdn.ne ...
- php生成mysql的数据字典
<?php header('content-type:text/html;charset=utf-8'); define('DB_HOST','localhost'); define('DB_U ...
- Python循环嵌套
可以在循环体内嵌入其他的循环体,如在while循环中可以嵌入for循环, 反之,你可以在for循环中嵌入while循环. 实例: 以下实例使用了嵌套循环输出3~13之间的素数: 以上实例输出结果: F ...
- 养成好的JAVA编码习惯
原文:http://blog.csdn.net/lifuxiangcaohui/article/details/25231027 最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下 ...
- 工作流学习——Activiti流程定义管理三步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...
- libuv里的几个缺陷
libuv是node.js使用的基础库,主要包括主循环,文件和网络接口.虽然libuv是为node.js而生的,但它本身是一个独立的库,加上使用简单方便,所以在node.js之外也有不少人使用.最近整 ...