POJ 2472 &&ZOJ 2797 (106 miles to Chicago)

来源:互联网 发布:淘宝上有好看衣服吗 编辑:程序博客网 时间:2024/05/22 23:04

链接:click here

题意:

Elwood和Jack要从the Palace Hotel(顶点1)尽量躲避警察的追捕,驾车到Chicago(顶点n)。现在有n个顶点,m条边,给出在每条边上不被警察追捕到的几率,问最终Elwood和Jack能安全到达Chicago而不被警察追捕到的最大概率是多少。

思路:就是求从起点到终点的最小概率 floyd 算法(也可以用逆向的dijkstra要求的不是最小的,而是最大的。),涉及到概率,注意一下精度。
参考代码;
#include <iostream>#include <string>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <cmath>#include <vector>using namespace std;double cost[101][101];int i,j,k,m,n,x,y,p;void floyd(){    for(k=1; k<=n; k++)        for(i=1; i<=n; i++)            for(j=1; j<=n; j++)                if(cost[i][j]<cost[i][k]*cost[k][j]) //注意是乘法                    cost[i][j]=cost[i][k]*cost[k][j];}void init(){    for(i=1; i<=n; i++)        for(j=1; j<=n; j++)        {            if(i==j) cost[i][j]=1;            else                cost[i][j]=0;        }}void read(){    scanf("%d",&m);    for(i=1; i<=m; i++)    {        scanf("%d%d%d",&x,&y,&p);        cost[x][y]=cost[y][x]=(double)p/100;    }}int main(){    while(cin>>n&&n)    {        init();        read();        floyd();        printf("%.6lf percent\n",cost[1][n]*100);    }    return 0;}




0 0