uva 10048 - Audiophobia

简介: 点击打开链接uva 10048 题目意思: 现在城市污染很严重,除了平常的污染外还有什么声音污染。现在有c个城市,s个街道,每一个街道有一个声音的分贝值。

点击打开链接uva 10048


题目意思:

现在城市污染很严重,除了平常的污染外还有什么声音污染。现在有c个城市,s个街道,每一个街道有一个声音的分贝值。现在由于从某一点到另外一点有很多条路径,现在要求我们找到一条路径中使得这条路径上的最大的声音分贝是所有可达路径中最小的。如果没有输出“no path”,否则额输出这个最小值。


思路:最小生成树+kruskal

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

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


代码:

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 110

int c , s , q , cnt;
int father[MAXN];
int rank[MAXN];
int ans[10010];
struct query{
    int x;
    int y;
}que[10010];
struct Edge{
    int x;
    int y;
    int value;
}e[1010];

bool cmp(Edge e1 , Edge e2){
     return e1.value < e2.value;
}

void init_Set(){
     for(int i = 1 ; i <= c ; i++){
        father[i] = i;
        rank[i] = 1;
     }
}

int find_Set(int x){
    int tmp = x;
    while(father[tmp] != tmp)
       tmp = father[tmp];
    while(father[x] != tmp){
       int tmp_x = father[x];
       father[x] = tmp;
       x = tmp_x;
    }
    return tmp;
}

void union_Set(int x, int y){
     if(rank[x] >= rank[y]){
        rank[x] += rank[y];
        father[y] = x;
     }
     else{
        rank[y] += rank[x];
        father[x] = y;
     }
}

void judge(int x){
     for(int i = 0 ; i < q ; i++){
        if(find_Set(que[i].x) == find_Set(que[i].y) && !ans[i])
          ans[i] = e[x].value;
     }
}

void Kruskal(){
     printf("Case #%d\n" , cnt++);     
     init_Set();
     sort(e , e+s , cmp);
     memset(ans , 0 , sizeof(ans));
     for(int i = 0 ; i < s ; i++){
         int root_x = find_Set(e[i].x);
         int root_y = find_Set(e[i].y); 
         if(root_x != root_y){
            union_Set(root_x , root_y);
            judge(i);
         }
     }
     for(int i = 0 ; i < q ; i++){
        if(ans[i])
          printf("%d\n" , ans[i]);
        else
          printf("no path\n");
     }
}

int main(){
    //freopen("input.txt" , "r" , stdin);
    int flag = 1;
    cnt = 1;
    while(scanf("%d%d%d" , &c , &s , &q) && c+s+q){
        for(int i = 0 ; i < s ; i++)
           scanf("%d%d%d" , &e[i].x , &e[i].y , &e[i].value);
        for(int i = 0 ; i < q ; i++)
           scanf("%d%d" , &que[i].x , &que[i].y);
        if(flag)
          flag = 0;
        else
          printf("\n");
        Kruskal();
    }
    return 0;
}








目录
相关文章
uva 10340 all in all
输入两个字符串s和t,判断是否可以从t中删除0个或多个字符(其他字符顺序不变),得到字符串是。
52 0
uva10152 ShellSort
uva10152 ShellSort
85 0
|
机器学习/深度学习
uva 11806 - Cheerleaders
点击打开链接 题意:在一个n行m列的矩形里面放k个相同的石子,要求第一行,最后一行,第一列,最后一列都要有石子。问有几种方法? 思路: 1 如果题目没有要求“第一行,最后一行,第一列,最后一列都要有石子”,那么答案就是C[n*m][k],我们用C[i][j]表示i个里面选择j个的组合数。
832 0
uva 10273 Eat or Not to Eat?
点击打开链接uva 10273 思路: 暴力求解 分析: 1 题目要求没有吃掉的奶牛的个数已经最后一次吃掉奶牛的天数 2 没有其它的方法只能暴力,对于n头牛的n个周期求最小公倍数,然后在2个公倍数之内暴力求解 代码: #inclu...
837 0
uva 1394 - And Then There Was One
点击打开链接uva 1394 思路: 数学递推 分析: 1 题目是一道变形的约瑟夫环变形问题 2 网上看到一篇很好的数学递推法 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。
1009 0
uva 11627 Slalom
点击打开链接uva 11627 思路:二分答案 分析: 1 给定S个滑雪板的速度,问是否可以找到一个滑板使得通过所有的门的时间最少,如果找不到输出IMPOSSIBLE 2 很明显的二分题目,我们知道了二分那应该怎么判断是否可以通过所有...
1076 0
|
机器学习/深度学习 并行计算 AI芯片
刘汝佳uva 字符串专题
第一题   palindrome 点击打开链接uva 401 题目意思:给定一个字符串判断是什么类型 分析: 1 根据输出我们知道这个字符串总共有4种类型 2 首先应该是否是“palindrome ”,判断的理由很简单直接对这个...
1144 0
|
人工智能
uva3177BeijingGuards
题意:有n个人围城一个圈,其中第i个人想要ri个不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物,如果两个相邻的人拥有同一种礼物,则双方都会很不高兴。问:医用需要多少种礼物才能满足所有人的需要?假设每种礼物有无穷多个,不相邻的两个人不会一起聊天。
757 0