最短路问题变形。
题意是给你一些道路,和路过时不被抓的概率。要求找一条到达目的地时不被抓的最大概率概率。
初始 dis[]设为 1 。其余为 0 。找最大即可。
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include<iostream> #include<list> #include<set> #include<cmath> #define INF 0x7fffffff #define eps 1e-6 #define LL long long using namespace std; int n,m; struct lx { int v; double p; }; vector<lx> g[101]; void SPFA() { double dis[101]; bool vis[101]; for(int i=1;i<=n;i++) dis[i]=0,vis[i]=0; dis[1]=1.0,vis[1]=1; queue<int>q; q.push(1); while(!q.empty()) { int u=q.front();q.pop(); vis[u]=0; for(int j=0;j<g[u].size();j++) { int v=g[u][j].v; double p=g[u][j].p; if(dis[v]<dis[u]*p) { dis[v]=dis[u]*p; if(!vis[v]) { vis[v]=1; q.push(v); } } } } printf("%f percent\n",dis[n]*100); } int main() { while(scanf("%d",&n),n) { scanf("%d",&m); for(int i=0;i<=n;i++) g[i].clear(); int u,v; double p; while(m--) { scanf("%d%d%lf",&u,&v,&p); lx now; now.p=p/100.0; now.v=v; g[u].push_back(now); now.v=u; g[v].push_back(now); } SPFA(); } }
原文地址:http://blog.csdn.net/dongshimou/article/details/37995655