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;
}
继续加油~
给一个无向图,边权代表安全通过的百分比值,求从点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;
}
继续加油~
相关文章推荐
- poj 2472--106 miles to Chicago-最短路flody
- 106 miles to Chicago SPOJ - CHICAGO(dijkstra)
- 【POJ】2472 106 miles to Chicago 最短路
- POJ 2472 106 miles to Chicago(最短路)
- hoj 2012 winter training Graph Day1 106 miles to Chicago图论最短路dijkstra算法
- poj 2472 106 miles to Chicago floyd
- 106 miles to Chicago
- POJ 2472:106 miles to Chicago
- POJ 2472 106 miles to Chicago(Floyd)
- POJ 2472 106 miles to Chicago
- ZOJ 2797 106 miles to Chicago(多校连萌,用最短路径求概率问题)
- POJ 2472 ||SDUT 2358 106 miles to Chicago(Dijkstra算法变形)
- ZOJ 2797 106 miles to Chicago
- poj 2472 106 miles to Chicago
- toj2134 106 miles to Chicago
- poj 2472 106 miles to Chicago a->b有安全概率,求i->j安全概率最大的一条路
- ZOJ 2797 106 miles to Chicago
- POJ 2472 106 miles to Chicago(Dijstra变形——史上最坑的最长路问题)
- poj 2472 106 miles to Chicago
- POJ 2472 106 miles to Chicago