题目故事很有趣。其实就是让你找一条路径,这个路径最安全,被定义为最不可能被警察抓到的路。
输入的文本包含多组测试数据,每组第一行为两个整数n,m。n为交叉路口的数目,m为街道的数目,接下来m行来描述每一个 街道,输入a,b,p。a,b为这条街道的两个交叉路口,p为同个这个街道不能被抓到的概率。街道时双向的。
最短路的变形,把路径最短的三角不等式转化为概率最大就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int N = 110;
double Graph[N][N];
int n,m;
void dijkstra()
{
bool vis[N];
double dis[N];
for(int i = 1 ; i <= n ; i++)
{
dis[i] = Graph[1][i];
vis[i] = false;
}
dis[1] = 1.0;
vis[1] = true;
for(int i = 2 ; i <= n ; i++)
{
int k;
double maxx = 0.0;//比较类型的一致
for(int j = 2 ; j <= n ; j++)
{
if(!vis[j] && dis[j] > maxx)
{
k = j;
maxx = dis[j];
}
}
vis[k] = true;
for(int j = 2 ; j <= n ; j++)
{
if(!vis[j] && dis[j] < dis[k] * Graph[k][j])
{
dis[j] = dis[k]*Graph[k][j];
}
}
}
printf("%.6lf percent\n",dis[n]*100);
}
int main()
{
while(scanf("%d",&n) && n)
{
scanf("%d",&m);
memset(Graph,0,sizeof(Graph));
int a,b,c;
double f;
for(int i = 0 ; i < m ; i++)
{
scanf("%d %d %d",&a,&b,&c);
f = ((double)c)/100;
Graph[a][b] = f;
Graph[b][a] = f;
}
dijkstra();
}
return 0;
}