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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

UVa 10048 Audiophobia (任意两点最长边的最小化)

Kruskal算法: #include #include #include #include #include #include #include #include #include #includ...

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

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

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

hdu 1853 Cyclic Tour 最大权值匹配 所有点连成环的最小边权和

题意: 给你若干个点和带权有向边,要求把所有点连成环,可以多个环,但是每个环至少要有两个点。 做法: 所有的点成环,可以知道所有的点 入度和出度都为1。并且只要符合这个条件,所有点肯定是在一个环中的...

UVA 10369(求第K长的边,kruskal算法模板)

题目大意: 有P个站点和S个卫星及无限长度的无线网,要把站点联通,卫星对两地的距离没有任何要求,无线网在距离越长时,所消耗的费用越多,耗费的价格按照那条最长的用无线网架设的路的长度来算,求最小话费...

【Codeforces Round 329 (Div 2) D】【LCA+并查集路径压缩】Happy Tree Party 除上两点间路径全部权值

#include #include #include #include #include #include #include #include #include #include #include #...

poj 2253 Frogger floyd 长路求权值最大边,属于简单题!!!!

刚开始做这道题的时候,一看就是floyd,果断打代码,wa了,然后就看看discuss,我去,全是dij,和prim,还有什么二分加并查集,这一下子给我整抑郁了后来终于看见一个志同道合的,一句话一语道...

最小生成树 prime算法 求权值最大的边

Out of Hay Description The cows have run out of hay, a horrible event that must be remedied imme...

hdu1598 求满足最大权值最小权值差最小的生成树

/*题意:已知一张图,给定起点终点,求出包含起点和终点的生成树: 使得生成树的最大边权与最小边权之差最小,并输出其值。若不连通,输出-1*/ /* 思路:先对边按权值排序。然后从最小的边开始枚举至最...

hdu 3452 Bonsai 求最少去掉多少权值的边使得所有的叶子节点和根节点断开连接

Problem Description After being assaulted in the parking lot by Mr. Miyagi following the "All Val...

Kruskal 最小生成树(输出最小生成树的路径,权值的和) 参考poj 1258

输入无向图的,矩阵存储格式, package com.liang.poj; import java.util.Scanner; public class Test2485Kruskal ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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