UVA10048 - Audiophobia

                          UVA10048 - Audiophobia

題目鏈接https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=989

題意:給定N個點M條邊,給定q個詢問,詢問x-y的路徑上使得經過的每條邊的最大值最小的值。

題解:任意節點的詢問用Floyd,求最大值最小將轉移方程改爲d[i][j]=min(d[i][j],max(d[i][k],d[k][j])即可。

AC代碼:

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 105;
const int inf = 0x3f3f3f;
#define _for(i,a,b) for(int i=a;i<=b;i++)
int t,n,a[maxn][maxn],m,q;
int main(int argc, char const *argv[])
{
    //freopen("now.in","r",stdin);
    while(cin>>n>>m>>q)
    {
        if(!n&&!m&&!q)break;
        if(t!=0)cout<<endl;
        _for(i,1,n)
        {
            _for(j,1,n)
            if(i==j)a[i][j]=0;
            else a[i][j]=inf;
        }
        _for(i,1,m)
        {
            int x,y,z;
            cin>>x>>y>>z;
            a[x][y]=z;
            a[y][x]=z;
        }
        _for(k,1,n)
        {
            _for(i,1,n)
            {
                _for(j,1,n)a[i][j]=min(a[i][j],max(a[i][k],a[k][j]));
            }
        }
        cout<<"Case #"<<++t<<endl;
        _for(i,1,q)
        {
            int x,y;
            cin>>x>>y;
            if(a[x][y]==inf)cout<<"no path"<<endl;
            else cout<<a[x][y]<<endl;
        }
    }
    return 0;
}

發佈了177 篇原創文章 · 獲贊 17 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章