poj 1511 鄰接表 堆優化的dijstra

2021-08-05 18:52:55 字數 991 閱讀 5000

這題最終的意思很簡單,輸入圖,求出從源點到所有點的最短路,再把這個圖的所有邊反向,再求一次源點到所有點的最短路。

這個和poj另一道題很相似,合適這題 的意義在於資料。

你這個圖是無法用鄰接矩陣存下的,因為鄰接矩陣太大了,你只能用鄰接表。

那麼這個題就是用鄰接表的用優先佇列優化過的dijstra過的了。

(其實堆優化就是用優先佇列而已,不和那些人裝樣子……)

注意這個圖的所有邊反向是怎麼實現的。

ac**:

#include #include #include #include #include using namespace std;

const int maxe=1e6+10;

const int maxv=1e6+10;

const int inf=0x3f3f3f3f;

typedef long long ll;

int n,m;

int restore[maxe][3];

int which=1;

int head[maxv];

struct edge

}e[maxv];

void add(int s, int d,int w)

void initforgraph()

struct pnwdis

};int dis[maxv];

void dijstra(int st)}}

}}void print()

printf("\n");

}int main()

dijstra(1);

for(int i=1;i<=n;i++)

ans+=dis[i];

initforgraph();

which=1;

for(int i=1;i<=m;i++)

dijstra(1);

for(int i=1;i<=n;i++)

ans+=dis[i];

cout<

貼個模板,POJ 1511

n個點m條邊,有向圖,求1到其餘各點的最短距離與各點到1的距離最短的路徑總和。n m 1e6 樸素必跪。dijkstra堆優化和spfa應該都能過。因為是有向圖,求1到各點的距離,直接原圖上跑spfa。求各點回到1的距離,將邊反轉 from變to to 變from 在新圖上再跑一遍spfa。8s的題...

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 1511 雙向單源最短路 SPFA 鄰接表

最近在複習最短路演算法 然後今天在看差分約束系統的時候看到了這一題poj 1511 題目的大意 給出n個點和n條有向邊,求所有點到源點1的來回最短路之和 保證每個點都可以往返源點1 題目意思很簡單,但是資料規模很大,當時知道資料規模很大,用一般的方法肯定會超時或者其他錯誤,但是還是用基礎的方法寫了一...