题意:有n地点,从一个地点到另一个地点有被抓的可能性,问从地点1到地点n不被抓的可能性最大是多少。
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1797
——>>Dijkstra算法题目,题目是那么的简单,直接用Dijkstra算法一上即可(注间边界设置:地点自己到自己不被抓的可能性为100%,到其他没边的地点被抓的可能性为0(就是一定被抓)),却不想中间用来比较的浮点型变量m设为了整型——千里之堤,溃于蚁穴!!!
#include <iostream> #include <string.h> #include <iomanip> using namespace std; const int maxn = 100 + 10; //最多有99个点,开110的大小 double G[maxn][maxn]; //用邻接矩阵保存权值 int main() { int n, m, i, j, v1, v2; //v1,v2,pro为输入的中间变量 double pro; while(cin>>n) { if(n == 0) return 0; cin>>m; memset(G, 0, sizeof(G)); for(i = 1; i <= m; i++) //存储邻接矩阵 { cin>>v1>>v2>>pro; G[v1][v2] = pro; G[v2][v1] = pro; } for(i = 1; i <= n; i++) G[i][i] = 100; bool v[maxn]; //判断点是否走过 memset(v, 0, sizeof(v)); //初始化为0 double d[maxn]; //d[i]表示从结点1开始,到结点i的最大不被抓百分率 for(i = 1; i <= n; i++) d[i] = G[1][i]; //初始化 d[1] = 1; //起始点标为已走 for(i = 0; i < n-1; i++) //n个点,起始点标记,还需标记n-1个点 { int x; double m = 0; //小心!!!这个别定义为了整型!!! for(j = 1; j <= n; j++) //求从结点1出发的最大不被抓百分率,保存为m,下标为x if(!v[j] && d[j] >= m) m = d[x=j]; v[x] = 1; //标记为走过(每次都一定会找到一个点,不用判断是否找得到) for(j = 1; j <= n; j++) //修改其他点的最大不被抓百分率 d[j] = (d[j] > d[x]*G[x][j]/100.0 ? d[j] : d[x]*G[x][j]/100.0); } cout<<setiosflags(ios::fixed)<<setprecision(6)<<d[n]<<" percent"<<endl; } return 0; }