WHU 1542 Countries (floyd)
题意:
在小明出生的星球X上有n国家。
一些国家通过结盟而拥有良好的双边关系,因此他们的公民得益于这些政策,使得所有这些国家之间的旅行变得免费。
但是,不同联盟之间的旅行就不是这么容易了。如果可能,它必须花一些钱。
请帮小明计算出国家之间的最小花费。
输入:
输入包含多组样例。
每组样例的第一行有两个整数 n 和 m 。(1<=n<=10^5, 1<=m<=10^5)
接下来的m行,每行有x, y, c。 其中 c 表示 x, y之间的花费。如果c为0,则表示x和y属于同一个联盟。(1<=x, y<=n, 0<=c<=10^9)
你可以假设两个国家之间没有多于一条路。
然后下一行是一个整数q,代表有多少个询问。(1<=q<=200)
接下来有q行,每行包括x, y。(1<=x, y<=n)
保证不会超过两百个联盟。
当输入n=0时,结束。
输出:
对于每组输入,每个询问输出一行。如果不可能,输出"-1"。
思路:
对于同一个联盟的国家,我们可以把他们看成一个国家,因为他们一定是连起来的。 然后跑floyd。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll; const int MAXN = (int) 1e5+;
const int MAXC = ; struct Edge{
int x, y;
ll c;
}a[MAXN]; int p[MAXN];
int f[MAXN];
ll d[MAXC][MAXC];
int n, m, q;
int cnt; int Find(int x) {
int res = x;
int t; while (f[res]!=res) res = f[res];
while (x!=res) {
t = x;
x = f[x];
f[t] = res;
}
return res;
} void Union(int x, int y) {
f[Find(x)] = Find(y);
} void floyd() {
for (int k = ; k < cnt; k++)
for (int i = ; i < cnt; i++)
for (int j = ; j < cnt; j++)
if (-!=d[i][k] && -!=d[k][j]) {
if (-==d[i][j]) {
d[i][j] = d[i][k]+d[k][j];
} else
d[i][j] = min(d[i][j], d[i][k]+d[k][j]);
}
} int main() {
#ifdef Phantom01
freopen("WHU1542.txt", "r", stdin);
#endif // Phantom01 while (scanf("%d", &n)!=EOF) {
if (==n) break;
scanf("%d", &m);
cnt = ;
for (int i = ; i <= n; i++)
f[i] = i;
for (int i = ; i < m; i++) {
scanf("%d%d%lld", &a[i].x, &a[i].y, &a[i].c);
if ( == a[i].c) Union(a[i].x, a[i].y);
}
for (int i = ; i <= n; i++) {
if (i==f[i]) //如果是根,
p[i] = cnt++;
}
for (int i = ; i < cnt; i++) {
for (int j = ; j < cnt; j++)
d[i][j] = -;
d[i][i] = ;
}
int x, y;
for (int i = ; i < m; i++) {
x = p[Find(a[i].x)];
y = p[Find(a[i].y)];
d[x][y] = -==d[x][y] ? a[i].c : min(d[x][y], a[i].c);
d[y][x] = -==d[y][x] ? a[i].c : min(d[y][x], a[i].c);
}
floyd();
scanf("%d", &q);
for (int i = ; i < q; i++) {
scanf("%d%d", &x, &y);
printf("%lld\n", d[p[Find(x)]][p[Find(y)]]);
}
} return ;
}
WHU 1542 Countries (floyd)的更多相关文章
- WOJ 1542 Countries 并查集转化新点+最短路
http://acm.whu.edu.cn/land/problem/detail?problem_id=1542 今天做武大的网赛题,哎,还是不够努力啊,只搞出三个 这个题目一看就是个最短路,但是题 ...
- [原]武大预选赛F题-(裸并查集+下标离散化+floyd最短路)
Problem 1542 - F - Countries Time Limit: 1000MS Memory Limit: 65536KB Total Submit: 266 Accepted: 36 ...
- Countries in War -POJ3114Tarjan缩点+SPFA
Countries in War Time Limit: 1000MS Memory Limit: 65536K Description In the year 2050, after differe ...
- ACM: HDU 5418 Victor and World - Floyd算法+dp状态压缩
HDU 5418 Victor and World Time Limit:2000MS Memory Limit:131072KB 64bit IO Format:%I64d & ...
- UVa 104 - Arbitrage(Floyd动态规划)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- ZOJ1221 && UVA567:Risk(Floyd)
Risk is a board game in which several opposing players attempt to conquer the world. The gameboard c ...
- HDU 5418——Victor and World——————【状态压缩+floyd】
Victor and World Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Other ...
- uva 104 Arbitrage (DP + floyd)
uva 104 Arbitrage Description Download as PDF Background The use of computers in the finance industr ...
- floyd算法学习笔记
算法思路 路径矩阵 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1):又 ...
随机推荐
- Ubuntu系统下安装Eclipse
第一步:查看操作系统位数. 打开终端,输入file /sbin/init 可以看到笔者Ubuntu系统为32位,读者可以使用该命令获取自己机器上的操作系统位数. 这一步是最至关重要的一步,笔者机器处理 ...
- Codeforces 988F. Rain and Umbrellas
解题思路:动态规划 遍历点i,如果从前一个点i-1走到这个点i不需要伞,则疲劳值不变dp[i] = dp[i-1]. 如果前一个点i-1走到这一个点i需要伞,则从前面找一把伞. 即遍历前面的每个点j, ...
- SpringBoot学习笔记(11)-----SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用
1. activemq 首先引入依赖 pom.xml文件 <dependency> <groupId>org.springframework.boot</groupId& ...
- 织梦DEDECMS系统中文章内容为空 用SQL语句如何删除?
织梦后台里提供了清空内容为空的文章,可是发现并不好用,有些空文章还是删除不了,而有些文章不是空的,只是采到了几个字,这些无法清除,于是就手动来清除这个文章.开始是一个一个文章找,一个一个来删除,后来觉 ...
- 箭头函数的this
定义时所处的对象就是它的this 看外层是否有函数 如果有,外层函数的this就是内部箭头函数的this 如果没有,this就是window let obj = { name : '箭头函数', ge ...
- HDU-4221 Greedy? 贪心 从元素的相对位置开始考虑
题目链接:https://cn.vjudge.net/problem/HDU-4221 题意 给n个活动,每个活动需要一段时间C来完成,并且有一个截止时间D 当完成时间t大于截止时间完成时,会扣除t- ...
- luogu P3765 总统选举(线段树维护摩尔投票+平衡树)
这题需要一个黑科技--摩尔投票.这是一个什么东西?一个神奇的方法求一个序列中出现次数大于长度一半的数. 简而言之就是同加异减: 比如有一个代表投票结果的序列. \[[1,2,1,1,2,1,1]\] ...
- dropload上拉加载 下拉刷新
1.引入css.js <link rel="stylesheet" href=" ${pageContext.request.contextPath}/dist/d ...
- Unity 3D本地公布WebPlayer版时"Failed to download data file"解决方式
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzZW55YW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- 三层登录—c#
学习了三层,有一个登录窗口的小练习.是我们第一次接触三层的初战.如今仅仅是简单的了解了一些,须要学习的还有非常多,以下浅谈自己的理解. 我们说的三层就是分层了显示层.业务逻辑层和数据訪问层.当中显示层 ...