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

原创 2013年12月03日 16:03:28


  Problem B: Audiophobia 
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 $C (\le 100)$, $S (\le1000)$ and $Q (\le 10000)$ 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 ( $c_1 \ne c_2$) is d decibels.

Each of the next Q lines contains two integers c1 and c2 ( $c_1 \ne c_2$) 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

思路:最小生成树+kruskal(借鉴)

要求:所有满足能够到达终点的路径中一条边的最大值中的最小值,那么自然跟最小生成树联系起来

分析:利用kruskal的算法的思想,我们先把所有的要求的路径保存起来。那么利用kruskal开始生成树,每加入一个连通分量的我们就去判断所有要求的路径中是否已经在同一个连通分量里面并且没有求过,因为我们知道如果两个点在这一次合并后变成同一个连通分量,那么这两个点的最短路已经形成,并且由于kruskal的性质上一次加入的边长度肯定比下一次加入的小。所以可以知道这个路径要求的ans 就是当前的这个边的权值

下面是代码:

#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算法

最小生成树~kruskal算法           生成树的概念:                   给定一个无向图,如果它的某个子图中任意两个顶点互相连通,并且是一棵树(即不存在环),则此子图便称...
  • LSGBB
  • LSGBB
  • 2015年08月18日 16:52
  • 377

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

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

[POJ 3764] The xor-longest Path (Tire树 + 贪心)

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

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

理解最小生成树与权值最小边无关@(算法学习)驳斥:具有n个顶点的有向图G的最小生成树不唯一,则其权值最小的边一定有多条。有两种最小生成树,但是实际上权值最小的边只有一条。更简洁的说,最小生成树与权值最...
  • u011240016
  • 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
  • Loi_Vampire
  • 2016年10月28日 16:52
  • 245

51nod 1212 无向图最小生成树(Kruskal算法)

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

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

这道zoj的题目,主要运用的是求最小生成树的知识,我用的是kruskal算法,当然,用取权值最小边的最小堆和查看是否有回路的并查集是自己实现的。但提交了几次都没成功,查了下,原来是自己的输出格式没有正...
  • iqRocket
  • iqRocket
  • 2012年12月07日 18:49
  • 3604

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

把一个连通无向图的生成树边按权值递增排序,称排好序的边权列表为有序边权列表,则任意两棵最小生成树的有序边权列表是相同的。(算法导论23.1-8) 证:设最小生成树有n条边,任意两棵最小生成树分别称为A...
  • zhaofukai
  • zhaofukai
  • 2011年03月14日 17:31
  • 2586

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

题目链接POJ2253题目大意输入N(2≤\leN≤\le200)个点的坐标,任意两点可以互相到达,经过的距离为它们的欧式距离。现在从1号点到2号点有多条路径,求这些路径中最大边权值的最小值。分析这题...
  • yyt330507870
  • yyt330507870
  • 2017年04月26日 17:01
  • 444

HDOJ 5631 Rikka with Graph (删边判断连通性)

问题描述 众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的: 给出一张 nn 个点 n+1n+1 条边的无向图,你可以选择一些边(至少一条)删除。 现在勇太想...
  • helloiamclh
  • helloiamclh
  • 2016年02月20日 23:21
  • 466
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Kruskal求两点之间边权值最小的边+Uva10048
举报原因:
原因补充:

(最多只允许输入30个字)