[討論] 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