Problem 1542 - F - Countries

Time Limit: 1000MS Memory Limit: 65536KB

Total Submit: 266 Accepted: 36 Special Judge: No

Description

There are n countries at planet X on which Xiao Ming was born.





Some countries, which have been sharing fine bilateral relations, form a coalition and thus all of their citizens will benefit from a policy for which all the travels between these countries will become totally free.



But it is not easy to travel between countries distributed in different coalitions. If possible, it must cost some money called YZB(yu zhou bi) which is always positive.



Help Xiao Ming determine the minimum cost between countries.

Input

The input consists of one or more test cases.



First line of each test case consists two integers n and m. (1<=n<=10^5, 1<=m<=10^5)



Each of the following m lines contains: x y c, and c indicating the YZB traveling from x to y or from y to x. If it equals to zero, that means x and y are in the same coalition. (1<=x, y<=n, 0<=c<=10^9)

You can assume that there are no more than one road between two countries.



Then the next line contains an integer q, the number of queries.(1<=q<=200)



Each of the following q lines contains: x y. (1<=x, y<=n)



It is guaranteed that there are no more 200 coalitions.



Input is terminated by a value of zero (0) for n.

Output

For each test case, output each query in a line. If it is impossible, output “-1”.



Sample Input

6 5

1 2 0

2 4 1

3 5 0

1 4 1

1 6 2

3

4 2

1 3

4 6

0

Sample Output

1

-1

3

AC代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define INF1 1000000000000000001
#define INF2 1000000009
const int maxn = 100010;
struct node{
int s,e,w;
}map[maxn];
long long d[201][201];
long long fa[maxn];
int n, m;
int h[maxn];
void init(int a)
{
for(int i = 0; i <= a; i++)
{
fa[i] = i;
h[i] = 0;
}
for(int i = 0; i <= a; i++){
map[i].w = INF2;
}
} int Find(int x)
{
if(fa[x] == x)
return x;
else
return fa[x] = Find(fa[x]);
} void unite(int x,int y)
{
x = Find(fa[x]);
y = Find(fa[y]); if(x == y) return;
else
{
if(h[x] > h[y]) fa[y] = fa[x];
else
{
fa[x] = fa[y];
if(h[x] == h[y]) h[y]++;
}
}
}
bool M[maxn];
int s[maxn];
int r;
void discretize(){
memset(M, false, sizeof(M));
//memset(s, 0, sizeof(s));
int k;
for(int i = 1; i <= n; i++){
k = Find(i);
if(!M[k]){
s[k] = r++;
M[k] = true;
}
}
for(int i = 1; i < r; i++){
for(int j = 1; j < r; j++){
if(i == j) d[i][j] = 0;
else d[i][j] = INF1;
}
}
for(int j = 1; j <= m; j++){
if(map[j].w != 0){
int dx = Find(map[j].s);
int dy = Find(map[j].e);
dx = s[dx];
dy = s[dy];
d[dx][dy] = d[dy][dx] = min(d[dx][dy],(long long)map[j].w);
//cout<<"*"<<d[dx][dy]<<"*"<<endl;
}
}
} void floyd(int r){
for(int k = 1; k < r; k++)
for(int i = 1; i < r; i++)
for(int j = 1; j < r; j++){
if(d[i][k] < INF1 && d[k][j] < INF1) d[i][j] = min(d[i][k] + d[k][j], d[i][j]);
}
}
void input(int m){
for(int i = 1; i <= m; i++){
int a , b;
scanf("%d%d",&map[i].s, &map[i].e);
scanf("%d",&map[i].w);
if(map[i].w == 0) unite(map[i].s, map[i].e);
}
} int main(){
while(cin>>n>>m&&n){
init(n);
input(m); r = 1;
discretize();
floyd(r); int q;
cin>>q;
while(q--){
int a, b;
scanf("%d%d",&a, &b);
a = Find(a);
b = Find(b);
a = s[a];
b = s[b];
if(d[a][b] == INF1) printf("-1\n");
else
printf("%lld\n",d[a][b]);
}
}
}

作者:u011652573 发表于2014-4-1 15:55:37 原文链接
阅读:58 评论:0 查看评论

[原]武大预选赛F题-(裸并查集+下标离散化+floyd最短路)的更多相关文章

  1. AtCoder Beginner Contest 247 F - Cards // dp + 并查集

    原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...

  2. [Comet OJ - Contest #6 D][48D 2280]另一道树题_并查集

    另一道树题 题目大意: 数据范围: 题解: 这个题第一眼能发现的是,我们的答案分成两种情况. 第一种是在非根节点汇合,第二种是在根节点汇合. 尝试枚举在第几回合结束,假设在第$i$回合结束的方案数为$ ...

  3. 【POJ】The Suspects(裸并查集)

    并查集的模板题,为了避免麻烦,合并的时候根节点大的合并到小的结点. #include<cstdio> #include<algorithm> using namespace s ...

  4. zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)

    题意:给出一棵树,找出一个点,求出所有点到这个点的权值和最大,权值为路径上所有边权的最小值. 用神奇的并查集,把路按照权值从大到小排序,然后用类似Kruskal的方法不断的加入边. 对于要加入的一条路 ...

  5. HDU 4750 Count The Pairs (2013南京网络赛1003题,并查集)

    Count The Pairs Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  6. POJ 2524 独一无二的宗教(裸并查集)

    题目链接: http://poj.org/problem?id=2524 Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K ...

  7. Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)

    题目链接  2016 ACM-ICPC EC-Final Problem G 题意  给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...

  8. hiho 171周 - 水题,并查集

    题目链接 题目描述: 输入4 alice 2 alice@hihocoder.com alice@gmail.com bob 1 bob@qq.com alicebest 2 alice@gmail. ...

  9. Codeforces Round #600 (Div. 2) D题【并查集+思维】

    题意:给你n个点,m条边,然后让你使得这个这个图成为一个协和图,需要加几条边.协和图就是,如果两个点之间有一条边,那么左端点与这之间任意一个点之间都要有条边. 思路:通过并查集不断维护连通量的最大编号 ...

随机推荐

  1. c++取小数整数部分

    #include<math.h> double ceil(double x) //向上取整 double floor(double x) //向下取整 向上取整,取比x大的第一个整数值向下 ...

  2. [工作记录] Android OpenGL ES 2.0: square texture not supported on some device

    npot texture: non-power-of-two texture.rectangle texture: non-square (height != wdith) 在测试Samsumg Ga ...

  3. css属性简写集合

    作为一个前端攻城狮,CSS那绝对是基础,可是基础也有掌握不牢的时候.今天就来总结一下容易写错的CSS属性简写问题. 1.background 背景颜色:background-color         ...

  4. quickeys 过期解决办法

    自己在系统中找了大半天,终于发现了一个叫.com.quickeys.quickeysX3.plist的文件,存在于硬盘的 ~/Library/Preferences/ 目录下,直觉感觉文件的大体内容应 ...

  5. 用fabric部署维护kle日志收集系统

    最近搞了一个logstash kafka elasticsearch kibana 整合部署的日志收集系统.部署参考lagstash + elasticsearch + kibana 3 + kafk ...

  6. ASP.NET页面优化性能提升方法记录

    今天与大家分享:一种优化页面执行速度的方法.采用这个方法,可以使用页面的执行速度获得[8倍]的提升效果. 为了让您对优化的效果有个直观的了解,我准备了下面的测试结果截图: 测试环境:1. Window ...

  7. android 关于Location of the Android SDK has not been setup in the preferences的解决方法

    今天在部署android开发环境的时候,每次打开eclipse的时候点击AVD Manager的按钮就会弹出Location of the Android SDK has not been setup ...

  8. 利用MariaDB Galera Cluster实现mariadb的多主复制

    一.MariaDB Galera Cluster概要: .简述: MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及数据实时同步的 ...

  9. CentOS用yum安装X Window

    安装X图形界面系统 yum list 列出所有可安装的软件包 可以通过 yum grouplist 来查看可能批量安装哪些列表 先装X windows #yum groupinstall 'X Win ...

  10. Android 4.4KitKat AudioRecord 流程分析

    Android是架构分为三层: 底层      Linux Kernel 中间层  主要由C++实现 (Android 60%源码都是C++实现) 应用层  主要由JAVA开发的应用程序 应用程序执行 ...