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の最短経路であり、さっきの推理で「の和」と「最小値を取る」を「最小値を取る」と「最大値を取る」に置き換え、推理は依然として適用される
コード#コード#
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;
}