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

SPOJ - CHICAGO 106 miles to Chicago(乘积最短路)

2017-10-20 14:45 766 查看
题意:

给一个无向图,边权代表安全通过的百分比值,求从点1到点n的最大安全百分比。

思路:

可以知道从一点到另一点的安全百分比是其经过的所有边权的乘积,所以需要对各个边权log一下,最终再取e^dis
就是答案。所以问题就转化为了求点1到点n的最长路。

代码:

#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const int maxn = 105;
const int maxm = maxn*maxn;
struct node {
int v;
double w;
bool operator<(const node k) const {
return w < k.w;
}
};
struct node1{double w; int v, next;} edge[maxm];
int no, head[maxn];
double dis[maxn];
bool vis[maxn];
priority_queue<node> q;
int n, m;
void init()
{
no = 0;
memset(head, -1, sizeof head);
}
inline void add(int u, int v, double w)
{
edge[no].v = v, edge[no].w = w;
edge[no].next = head[u]; head[u] = no++;
}
void work()
{
fill(dis, dis+n+1, -inf);
memset(vis, 0, sizeof vis);
while(!q.empty()) q.pop();
dis[1] = 0;
q.push((node){1, 0});
while(!q.empty())
{
node tp = q.top(); q.pop();
int u = tp.v;
if(vis[u]) continue;
vis[u] = 1;
for(int k = head[u]; k+1; k = edge[k].next)
{
int v = edge[k].v;
if(dis[v] < dis[u]+edge[k].w)
{
dis[v] = dis[u]+edge[k].w;
q.push((node){v, dis[v]});
}
}
}
printf("%.6f percent\n", exp(dis
)*100+eps);
}
int main()
{
while(scanf("%d", &n) && n && scanf("%d", &m))
{
init();
for(int i = 1; i <= m; ++i)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
add(u, v, log(w/100.0));
add(v, u, log(w/100.0));
}
work();
}
return 0;
}

继续加油~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: