# Kruskal求两点之间边权值最小的边+Uva10048

Consider yourself lucky! Consider yourself lucky to be still breathing and having fun participating in this contest. But we apprehend that many of your descendants may not have this luxury. For, as you know, we are the dwellers of one of the most polluted cities on earth. Pollution is everywhere, both in the environment and in society and our lack of consciousness is simply aggravating the situation.

However, for the time being, we will consider only one type of pollution ­- the sound pollution. The loudness or intensity level of sound is usually measured in decibels and sound having intensity level 130 decibels or higher is considered painful. The intensity level of normal conversation is 60­65 decibels and that of heavy traffic is 70­80 decibels.

Consider the following city map where the edges refer to streets and the nodes refer to crossings. The integer on each edge is the average intensity level of sound (in decibels) in the corresponding street.

To get from crossing A to crossing G you may follow the following path: A­C­F­G. In that case you must be capable of tolerating sound intensity as high as 140 decibels. For the paths A­B­E­G, A­B­D­G and A­C­F­D­G you must tolerate respectively 90, 120 and 80 decibels of sound intensity. There are other paths, too. However, it is clear that A­C­F­D­G is the most comfortable path since it does not demand you to tolerate more than 80 decibels.

In this problem, given a city map you are required to determine the minimum sound intensity level you must be able to tolerate in order to get from a given crossing to another.

## Input

The input may contain multiple test cases.

The first line of each test case contains three integers ,  and  where Cindicates the number of crossings (crossings are numbered using distinct integers ranging from 1 to C), Srepresents the number of streets and Q is the number of queries.

Each of the next S lines contains three integers: c1, c2 and d indicating that the average sound intensity level on the street connecting the crossings c1 and c2 ( ) is d decibels.

Each of the next Q lines contains two integers c1 and c2 ( ) asking for the minimum sound intensity level you must be able to tolerate in order to get from crossing c1 to crossing c2.

The input will terminate with three zeros form C, S and Q.

## Output

For each test case in the input first output the test case number (starting from 1) as shown in the sample output. Then for each query in the input print a line giving the minimum sound intensity level (in decibels) you must be able to tolerate in order to get from the first to the second crossing in the query. If there exists no path between them just print the line no path".

Print a blank line between two consecutive test cases.

## Sample Input

7 9 3
1 2 50
1 3 60
2 4 120
2 5 90
3 6 50
4 6 80
4 7 70
5 7 40
6 7 140
1 7
2 6
6 2
7 6 3
1 2 50
1 3 60
2 4 120
3 6 50
4 6 80
5 7 40
7 5
1 7
2 4
0 0 0


## Sample Output

Case #1
80
60
60

Case #2
40
no path
80


#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int MAX=1100;
struct node
{
int u,v;
int s;
} city[MAX];
struct inquir
{
int a,b;
} in[11000];
int C,S,Q;
int pre[110],rank[110],ans[10100];
bool cmp(node a,node b)
{
return a.s<b.s;
}
void init()
{
for(int i=0; i<=C; i++)
{
pre[i]=i;
rank[i]=i;
}
}
int find(int x)
{
if(pre[x]==x)
return x;
return pre[x]=find(pre[x]);
}
void unite(int x,int y)
{
if(rank[x]<rank[y])
pre[x]=y;
else
{
pre[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
}
void can(int x)
{
for(int i=1; i<=Q; i++)
{
if(find(in[i].a)==find(in[i].b)&&!ans[i])
{
ans[i]=city[x].s;
}
}
}
void K()
{
sort(city+1,city+S+1,cmp);
for(int i=1; i<=S; i++)
{
int x=find(city[i].u);
int y=find(city[i].v);
if(x!=y)
{
unite(x,y);
can(i);
}
}
for(int i=1; i<=Q; i++)
{
if(ans[i])
cout<<ans[i]<<endl;
else
cout<<"no path"<<endl;
}
}
int main()
{
//freopen("in.txt","r",stdin);
int c1,c2,sound;
int loop=1;
bool first=true;
while(cin>>C>>S>>Q,C+S+Q)
{

for(int i=1; i<=S; i++)
cin>>city[i].u>>city[i].v>>city[i].s;
init();
for(int i=1; i<=Q; i++)
{
cin>>in[i].a>>in[i].b;
ans[i]=0;
}
if(!first)
cout<<endl;
else
first=false;
cout<<"Case #"<<loop++<<endl;
K();

}
return 0;
}


• 本文已收录于以下专栏：

## 最小生成树~kruskal算法

• LSGBB
• 2015年08月18日 16:52
• 377

## fzu 2087 统计树边 (最小生成树kruskal)

Description 在图论中，树：任意两个顶点间有且只有一条路径的图。 生成树：包含了图中所有顶点的一种树。 最小生成树：对于连通的带权图(连通网)G，其生成树也是带权的。生成树T各边的...
• Misdom_Tian_Ya
• 2014年10月18日 13:06
• 357

## [POJ 3764] The xor-longest Path （Tire树 + 贪心）

POJ - 3674 题意是给你一个树，每条边有一个权值，求得树上一条路径，使路径上每条边权值的异或和最大 首先用一个 DFS把根到任意点的路径的异或和求出来 xorv[i] 由异或的性质可得点...
• u012015746
• 2016年04月07日 20:47
• 218

## 理解最小生成树与权值最小边无关

• u011240016
• 2016年11月21日 14:07
• 885

## BZOJ 1050 [HAOI2006]旅行comf

1050: [HAOI2006]旅行comfTime Limit: 10 Sec  Memory Limit: 162 MBDescription　　给你一个无向图，N(N...
• Loi_Vampire
• 2016年10月28日 16:52
• 245

## 51nod 1212 无向图最小生成树（Kruskal算法）

1212 无向图最小生成树 基准时间限制：1 秒 空间限制：131072 KB 分值: 0 难度：基础题  收藏  关注 N个点M条边的无向连通图，...
• a617350885
• 2016年08月30日 20:31
• 466

## zoj 1203求最小生成树的权值之和(kruskal算法实现)

• iqRocket
• 2012年12月07日 18:49
• 3604

## 一个图的两棵最小生成树，边的权值序列排序后结果相同

• zhaofukai
• 2011年03月14日 17:31
• 2586

## POJ 2253 Frogger (单源最短路变型 求路径上最大边权值的最小值)

• yyt330507870
• 2017年04月26日 17:01
• 444

## HDOJ 5631 Rikka with Graph （删边判断连通性）

• helloiamclh
• 2016年02月20日 23:21
• 466

举报原因： 您举报文章：Kruskal求两点之间边权值最小的边+Uva10048 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)