Audiophobia
Consider yourself lucky! Consider yourself lucky to be still breathing and having fun participating inthis contest. But we apprehend that many of your descendants may not have this luxury. For, as youknow, we are the dwellers of one of the most polluted cities on earth. Pollution is everywhere, both inthe 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. Theloudness or intensity level of sound is usually measured in decibels and sound having intensity level 130decibels or higher is considered painful. The intensity level of normal conversation is 6065 decibels andthat of heavy traffic is 7080 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 caseyou 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 sinceit 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 levelyou 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(≤ 100), S(≤ 1000) and Q(≤ 10000) whereC indicates the number of crossings (crossings are numbered using distinct integers ranging from 1 toC), S represents 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 soundintensity level on the street connecting the crossings c1 and c2 (c1 ̸= c2) is d decibels.
Each of the next Q lines contains two integers c1 and c2 (c1 ̸= c2) asking for the minimum soundintensity 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 thesample 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 thequery. If there exists no path between them just print the line “no path”.
Print a blank line between two consecutive test cases.
Floyd 变形:
该题是Floyd算法的一个巧妙变形,虽然AC率很高,但是真正要灵活变化到做出该题,显然要明白Floyd算法的思想和原理 ,弄清楚为什么可以这样更改算法的核心部分。
Floyd算法其实利用了动态规划的思想,适合求解结点不是很多的稠密图 。
我们都知道,动态规划在利用循环嵌套求解时是要规定一个次序的,这样才能将状态成功的转移 。该题的次序就是由k来定义的,从小到大枚举k,定义其意义为i和j之间一点。
那么对于每一个i和j以及每一个k,最优状态就的状态转移方程d[i][j] = min(d[i][j],d[i][k]+d[k][j]);
为什么这样可以表示出每两个点之间的最短路呢? 我们不妨将最短路看成动归中的最优解,那么每一个状态的最优解都是从局部最优解转移过来的,每一个状态都具有相似的子结构 ,所以就可以动态规划出所有的最优解了。
既然知道了其思想核心的动态规划,那么就不难修改了,修改时要注意状态方程所表示的新意义以及状态的转移 。
该题的状态方程即可写出:d[i][j] = min(d[i][j],max(d[i][k],d[k][j]));
附上代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#define INF 0x3f3f3f
using namespace std;
int path[110][110];
int main()
{
int n,m,k,sum = 0;
while(cin >> n >> m >>k)
{
if(n + m + k == 0)
break;
for(int i = 0;i <= n;i++)
fill(path[i],path[i] + 110,INF);
for(int i = 0;i < m;i++)
{
int a , b , c;
scanf("%d%d%d",&a,&b,&c);
path[a][b] = path[b][a] = c;
}
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
for(int k = 1;k <= n;k++)
{
if(path[j][i] != INF && path[i][k] != INF)
{
path[j][k] = min(path[j][k],max(path[j][i],path[i][k]));
}
}
if(sum > 0)
cout << endl;
sum++;
printf("Case #%d\n",sum);
for(int i = 0;i < k;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(path[a][b] != INF)
cout << path[a][b] << endl;
else
cout << "no path" << endl;
}
}
}