dijkstra堆優化 鏈式前向星的例題

2021-10-09 09:37:55 字數 1847 閱讀 6556

poj - 1511 invitation cards

在乙個有向圖中,計算從1到n中每個結點的最少費用,然後再求n個結點(2~n)到1的最少費用

從第乙個結點到各個結點的最少費用 ——> 單源最短路徑

從各個結點到第乙個結點的最少費用 ——> 反向建圖 + 單源最短路徑

所以用 反向建圖 + 兩次dijkstra

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

const int maxn = 1e6 + 10;

const int inf = 0x3f3f3f3f;

typedef long long ll;

int t,n,r,head[maxn],head1[maxn],dis[maxn],dis2[maxn],cnt,cnt1;

struct edgee[maxn],re[maxn];

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

void readd(int u,int v,int d)

struct node;

bool operator < (const node &x) const };

void dij()

dis[1] = 0;

q.push(node(1,0));

while(!q.empty())

} }}

void redij()

dis2[1] = 0;

q.push(node(1,0));

while(!q.empty())

} }}

int main()

dij();

redij();

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

ans += dis[i] + dis2[i];

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

} return 0;

}

poj - 3255 roadblocks

在無向圖中,求第1個結點到第n個結點的次短路,一條邊可以經過無數次

要麼是到第u個點是最短路,然後再加上u–>v這條邊

要麼是到第u個點是次短路,然後再加上u–>v這條邊

所以次短路是可以是由最短路+邊或者次短路+邊更新,所以我們需要將最短路與次短路都進入佇列,先更新最短路,然後再去更新次短路

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

const int maxn = 2e5 + 10;

const int n = 6000;

const int inf = 0x3f3f3f3f;

typedef long long ll;

int n,r,head[n],dis[n],dis2[n],cnt;

struct edgee[maxn];

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

struct node

bool operator < (const node &x) const };

void dij()

dis[1] = 0;

q.push(node(1,0));

while(!q.empty())

if(dis2[y] > dt && dis[y] < dt)

} }

printf("%d\n",dis2[n]);

}int main()

dij();

return 0;

}

最短路 Dijkstra 堆優化 鏈式前向星

題目鏈結 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n表...

poj1511 鏈式前向星 dijkstra堆優化

如果看題解往下划拉 這題網上說卡資料,只能鏈式前向星才能過?正好學一下鏈式前向星的處理 其實 這個和vector做的鄰接表差不多。可能用起來會快一點?不然這題鄰接表為啥過不了 我覺得dijkstra的堆優化和spfa算有非常強的關聯性 這裡提幾句 分析一下異同 spfa是一種基於bfs的單源最短路演...

dij堆優化 鏈式前向星 輸出路徑 模板

include include include include include using namespace std struct yyye 500100 2 前向星存圖 struct node 過載運算子實現小根堆 priority queue q stl 好 int tot,head 1001...