POJ 1511 雙向單源最短路 SPFA 鄰接表

2021-08-03 19:46:28 字數 2435 閱讀 3642

最近在複習最短路演算法

然後今天在看差分約束系統的時候看到了這一題poj 1511

題目的大意:

給出n個點和n條有向邊,求所有點到源點1的來回最短路之和(保證每個點都可以往返源點1)

題目意思很簡單,但是資料規模很大,當時知道資料規模很大,用一般的方法肯定會超時或者其他錯誤,但是還是用基礎的方法寫了一遍。

還有就是一地方需要注意,就是這題求的是雙向單源,所以還需要考慮一下,處理雙向的問題很簡單,逆向思維,求完第一遍之後,將儲存的圖方向調反,再spfa(1)一次,然後兩次的結果相加就是所求的答案了,這個逆向的思維很好。趕快找個本子記好。

第一次用的是spfa + 鄰接矩陣(然後死的很慘qaq)

有需要注意的小地方就是這題給的編號是從1開始的,所以在建圖的時候遍歷就要從1開始,不然肯定是錯的,而且錯的你還很難找出來,早上花了很久在找這個問題,後來解決了。然後這題如果資料規模不是很大的話可以用spfa+鄰接矩陣來寫,但是出題者給了10億的資料 ,這就比較尷尬了。所以,比較好的方法就是用spfa+鄰接表

下面講解一下spfa+鄰接表的演算法:

#include 

#include

#include

#include

#include

#include

using

namespace

std;

#define clr(arr, what) memset(arr, what, sizeof(arr))

const

int maxn = 1000010;

const

long

long max = 10000000000000005;

int head[maxn];

int key[maxn];

int next[maxn];

int node[maxn];

int num;

int nodenum,edgenum;

bool vis[maxn];

long

long dis[maxn];

struct edge

edge[maxn];

void add(int u,int v,int cost)

void init()

}long

long spfa(int start)}}

}for(int i=1;i<=nodenum;i++)

total += dis[i];

return total;

}int main(int argc, char

const *argv)

answer+=spfa(1);

init();

for(int i=0;i//反置圖

add(edge[i].v,edge[i].u,edge[i].weight);

answer+=spfa(1);

printf("%lld\n",answer);

}return

0;}

**如上,其實對於鄰接表不止乙個方法建

還有用到指標的,這裡是用head陣列來更新下乙個結點的序號來實現的

然後就是建立鄰接表的時候大致有乙個模子:

第一步

typedef struct

edge;

edge e[max];

int pre[max];

//初始化

memset(pre,-1,sizeof(pre));

//輸入

scanf("%d %d %d",&from,&to,&w1);

e[i].to = to;

e[i].w = w1;

e[i].next = pre[from];

pre[from] = i;

i++;

第二步

/now為弧尾結點序號,i為now所發出的邊序號,adj為弧頭結點序號,w為now–>adj這條邊的權值/

for(i = pre[now]; i != -1; i = edge[i].next)

因為鄰接表不是向鄰接矩陣那樣簡單易懂所以可能理解起來會有點麻煩

多練應該會好一點吧 ,遇到最短路的時候先嘗試用鄰接表建立一下看看然後再慢慢找漏洞,相信會有一天可以弄精鄰接表的。

好了 今天就到這裡了 去吃飯嘍 吃完飯繼續刷題哦 :)

POJ 1511 最短路徑

include include include using namespace std const int maxn 1000005 struct node node mat1 maxn mat2 maxn queueq node pool maxn 2 2 int counts long long...

POJ 1847 Tram 單源最短路徑

題意 軌道網,有若干轉換器,每個轉換器都和其他若干轉換器相連,轉換器初始指向第乙個與其相連的轉換器。問要到達終點需要最少轉換多少次?思路 可以用dijkstra單源最短路來做,把軌道網看做有向圖 因為1第乙個指向2,2的第乙個不一定指向1 當前轉換器處始指向的那個轉換器之間的路徑權值為0,其他路徑權...

Poj 3072 Robot(單源最短路徑)

這個題目很簡單,但是細節處理麻煩,以至於做得想吐。題目大意 題目給出 n個點的座標,機械人一次性可以移動的最長距離 r,當機械人要走向 xj,yj 時,必須轉向 xj,yj 沒轉1度需要1 秒,初始化機械人指向 xn,yn 求機械人從 x1,y1 到 xn,yn 所需要的時間。大體思路 從 x1,y...