您的位置:首页 > 编程语言 > Go语言

POJ 2472 106 miles to Chicago(最短路)

2012-04-12 18:09 441 查看
题目连接:http://poj.org/problem?id=2472

题意:男孩要从1到n城市,每条道路有他不被抓的百分比,输出他到n不被抓的最大概率。

题目的数据有些问题,边开到20W才过,求最长路径即可。

参考代码:

#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;

#define INS 0.0
#define N 1005  //顶点的个数
#define SIZE 200005 //边的个数
#define CLR(arr,v) memset(arr,v,sizeof(arr))

class short_path{
public:
short_path(){}
void init(int m,int n){
num_ed = m;num_v = n;
CLR(des,0);CLR(next,0); CLR(h,0);
for(int i = 0;i < N;++i)
dis[i] = INS;
while(!q.empty()) q.pop();
}
void add(int u,int v,double f){
des[++pos] = v;
val[pos] = f;
next[pos] = h[u];
h[u] = pos;
}
double Dijkstra(int start,int end){
dis[start] = 100.0;
mid.d = start;
mid.v = 100.0;
q.push(mid);
while(!q.empty()){
int s = q.top().d,v = q.top().v;
q.pop();
for(int i = h[s]; i ;i = next[i]){
if(dis[s] * val[i] / 100 > dis[ des[i] ]){
dis[ des[i] ] = dis[s] * val[i] / 100;
mid.d = des[i];
mid.v = dis[ des[i] ];
q.push(mid);
}
}
}
return dis[end];
}
private:
int h
,des[SIZE],next[SIZE];
double val[SIZE],dis
;
int pos,num_ed,num_v;
struct Edge{
int d;
double v;
bool operator<(const Edge &ed) const{
return v < ed.v;
}
};
struct Edge mid;
priority_queue<Edge> q;
};

class short_path sp;

int main()
{
int m,n;
while(~scanf("%d",&n),n)
{
scanf("%d",&m);
sp.init(m,n);
int u,v;
double c;
for(int i = 0;i < m;++i)
{
scanf("%d%d%lf",&u,&v,&c);
sp.add(u,v,c);
sp.add(v,u,c);
}
double res = sp.Dijkstra(1,n);
printf("%.6lf percent\n",res);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: