POJ 2472 106 miles to Chicago_专业打酱油_百度空间
Dijsktra就可以了,概率用相乘的,其他没什么区别。

{dy}次用的是priority_queue<vectex_t *, ...>,然后后来出现各种莫名其妙的问题,郁闷一下午,刚才才发现修改iter->dest->dist的时候可能队列里面的元素的dist也被修改了,然后队列就xx乱掉了,所以就会出问题,改成priority_queue<vectex_t, ...>就好了。

有关于一个顶点多次入队列:显然必然有一个dist最小的顶点先弹出来(这个顶点的dist就是src到这个点的最短路径),然后这个顶点更新了它的所有邻接节点并把它们压入队列(如果邻接节点的dist已经是最短路则显然不会被更新),等第二次同一个节点(但是dist较大)弹出来的时候,就不能去更新任何节点的dist了,所以实际上就是一个空的loop,不会影响结果。

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <iterator>
#include <functional>
#include <string>
#include <queue>

using namespace std;

struct edge_t {
struct vectex_t *src;
struct vectex_t *dest;
int weight;
edge_t *next;
};

struct vectex_t{
double dist;
edge_t *edges;
};

edge_t edges[10000];
edge_t *end_of_edges;
vectex_t vectices[100];

int nr_vectexs;

struct comp_cls {
bool operator () (vectex_t const &vptr1, vectex_t const &vptr2) const {
return vptr1.dist < vptr2.dist;
}
};

inline
void
add_edge(int src, int dest, int weight)
{
end_of_edges->next = vectices[src].edges;
end_of_edges->src = &vectices[src];
end_of_edges->dest = &vectices[dest];
end_of_edges->weight = weight;

vectices[src].edges = end_of_edges++;

return;
}

double
dijkstra(void)
{
priority_queue<vectex_t, vector<vectex_t>, comp_cls> pq;

vectices[0].dist = 1;
pq.push(vectices[0]);
while (pq.size()) {
vectex_t current(pq.top());

pq.pop();
for (edge_t *iter = current.edges; iter; iter = iter->next) {
if (iter->dest->dist < current.dist * iter->weight / 100) {
iter->dest->dist = current.dist * iter->weight / 100;
pq.push(*iter->dest);
}
}
}

return vectices[nr_vectexs - 1].dist * 100;
}

bool
solve_prob(void)
{
int nr_edges;

end_of_edges = edges;
memset(vectices, 0, sizeof(vectices));

cin >> nr_vectexs;
if (!nr_vectexs) {
return false;
}
cin >> nr_edges;
for (int i = 0; i != nr_edges; ++i) {
int src, dest, weight;

cin >> src >> dest >> weight;
--src;
--dest;
add_edge(src, dest, weight);
add_edge(dest, src, weight);
}
for (int i = 0; i != nr_vectexs; ++i) {
vectices[i].dist = 0;
}

cout << fixed << setprecision(6) << dijkstra() << " percent" << endl;

return true;
}

int
main()
{
ios::sync_with_stdio(false);

while (solve_prob()) {
;
}

return 0;
}


郑重声明:资讯 【POJ 2472 106 miles to Chicago_专业打酱油_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——