UVA 10048 Audiophobia(floyd変形)

4792 ワード

問題解
C個の点S条の辺の無方向の帯権図を入力して、辺権はこの経路の上の騒音の値を表して、騒音の値が大きすぎる時、耳膜は傷つけられることができて、だからあなたがある点から別の点に行く時、いつも道を通る最大の騒音の値が最小であることを望んで、いくつかの問い合わせを入力して、この2点の間の最大の騒音の値の最小の経路を出力します.
floydアルゴリズムを直接使いますが、加算をmin、minをmaxに変更します.解釈:floydであろうとdijkstraであろうと、いずれかの少なくとも2つのエッジを含む経路i->jに対して、i->jの全長がi->k,k->jの長さの和に等しくなるように、中間点kが必ず存在するという事実に基づいている.異なる点k,i->k,k->jの長さの和が異なる場合があり、最後に最小値を取る必要があるのがi->jの最短経路であり、さっきの推理で「の和」と「最小値を取る」を「最小値を取る」と「最大値を取る」に置き換え、推理は依然として適用される
コード#コード#
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define MAX 100005
const int INF = 1000001;
#define LL long long
int cas=1,T;

int d[105][105];
int main()
{
    int n,m,c;
    while (scanf("%d%d%d",&n,&m,&c) && n)
    {
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
            {
                d[i][i]=0;
                d[i][j]=INF;
            }
        for (int i = 1;i<=m;i++)
        {
           int f,t,di;
           scanf("%d%d%d",&f,&t,&di);
           d[f][t]=di;
           d[t][f]=di;     
        }
        for (int k=1;k<=n;k++)
            for (int i = 1;i<=n;i++)
                for (int j = 1;j<=n;j++)
                    d[i][j]=min(d[i][j],max(d[i][k],d[k][j]));

        if (cas!=1)
            printf("
"
); // printf("Case #%d
"
,cas++); for (int i = 0;iint s,e; scanf("%d%d",&s,&e); if (d[s][e]==INF) printf("no path
"
); else printf("%d
"
,d[s][e]); } } //freopen("in","r",stdin); //scanf("%d",&T); //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC); return 0; }