[讨论] Dijkstra UVa-10986 [已解决]

楼主: darrenlee1 (darrenleeleelee)   2020-06-13 18:06:23
抱歉又来打扰大家,这题明显是Dijkstra,我交上去是过的。
但我再跑Udebug(intput 是Batman那个) 却有21个不相同。
我想了一阵子,还是没找到问题,希望大家能帮我看一下。
udebug : https://www.udebug.com/UVa/10986
这是我的code
#include <bits/stdc++.h>
using namespace std;
int n, m ,S, T;
int w[20010][20010], dis[20010];
vector<int> v[20000+10];
struct Node
{
int node, weight;
Node(int _n, int _w){
node = _n;
weight = _w;
}
bool operator<(Node const other)const{
return weight > other.weight;
}
};
void dijsktra(int src)
{
priority_queue<Node> pq;
pq.push(Node(src, 0));
while(!pq.empty())
{
auto top = pq.top();
pq.pop();
if(dis[top.node] != 1e9) continue;
dis[top.node] = top.weight;
for(auto i : v[top.node]){
if(dis[i] == 1e9) pq.push(Node(i, top.weight + w[top.node][i]));
}
}
}
int main(int argc, char const *argv[])
{
int N, cnt = 1, temp1, temp2, tempw;
cin >> N;
while(N
作者: a58524andy (a58524andy)   2020-06-13 19:34:00
你的dijkstra好像有点…特别(?要更新的点不是只有无限远的
楼主: darrenlee1 (darrenleeleelee)   2020-06-13 19:38:00
对 但我一开始都设成无限远
作者: firejox (Tangent)   2020-06-14 13:35:00
同一楼,你这不是Dijkstra简单反例是ABC三点皆相邻,起点A终点C,AC > AB + BC
楼主: darrenlee1 (darrenleeleelee)   2020-06-14 14:11:00
但我每次都是目前能延伸最短的路径,假如AC>AB>BC 最短路径不会是AC这条边
作者: a58524andy (a58524andy)   2020-06-14 14:19:00
测资有zero edge,假设现在两点A B跟Source都是10同时AC = 1、BC = 0,你的queue刚好先扫A的话那么C不会被更新成S -> B -> C这个距离10而是会卡在S -> A -> C这个11*并且假设AB=0恩我在说什么@@ 这跟zero edge也没什么关系总之当SA=SB=10、AC=m、BC=n、queue刚好先选A来跑并且m>n的时候这个写法应该会出事
作者: chengweihsu (安安你好)   2020-06-14 15:07:00
感觉是input处理有问题,他好像没说顶点间的边数<=1你用adjacent matrix存边的权重,如果同一对顶点(u,v)有>=两条边,你只会纪录最后输入的那条,但那条可能比之前记的w[u][v]还大,这样你等于是在错的图上跑dijkstra
作者: a58524andy (a58524andy)   2020-06-14 15:32:00
测了一下,楼上应该是对的
楼主: darrenlee1 (darrenleeleelee)   2020-06-14 20:15:00
他有重复的边的话我应该把他都加起来在跑dijktra 吗我改成用+= 还是有点问题欸 还是是我理解有问题我有先清成0回一下a大,我是用pq每次会帮我把最小的pop out出来,所以一开始push (SA 10)(SB 10) 先把SA,pop out出来后会push(AC 10+m),所以接下来pop out的会是SB,因此m<n也不会有问题
作者: chengweihsu (安安你好)   2020-06-14 20:55:00
有重复边的话你处理input时,要多加条件判断而不是加起来,因为你最短路径一定是选所有连接(u,v)的边中最短的若路径包含(u,v)这两点
楼主: darrenlee1 (darrenleeleelee)   2020-06-14 21:00:00
谢谢~过了谢谢大家的帮忙

Links booklink

Contact Us: admin [ a t ] ucptt.com