POJ 3463 最短路 次短路

2021-08-27 01:11:28 字數 1234 閱讀 8525

本題是求最短路和比最短路距離長1的次短路的個數,於是就用到了dijkstra

主要的改變就是陣列都開到了二維,第二維用來表示是最短路還是次短路

比如d陣列和vis陣列

而cnt陣列使用來訪問最短路和次短路的次數

那麼最外層的迴圈就要到2*n-1次了,其中n-1次是用來求最短路的,還有n次是次短路的

然後鬆弛的條件就要改變了,有四種情況

1.比最短路短2.等於最短路3.長與最短路但短於次短路4.等於次短路

#include #include #include #include #include #define maxn 1005

#define maxm 500005

#define inf 1000000000

using namespace std;

struct node

edge[maxm];

int d[maxn][2], e, n, m;

int cnt[maxn][2];

int head[maxn];

bool vis[maxn][2];

void init()

void insert(int x, int y, int w)

int dijkstra(int s, int t)

else if(!vis[j][1] && d[j][1] < mini)

}if(mini == inf) break;

vis[u][flag] = 1;

for(int j = head[u] ; j != -1; j = edge[j].next)

else if(d[v][0] == mini + w) cnt[v][0] += cnt[u][flag];

else if(d[v][1] > mini + w)

else if(d[v][1] == mini + w) cnt[v][1] += cnt[u][flag];}}

int ans = 0;

if(d[t][1] == d[t][0] + 1) ans = cnt[t][1] + cnt[t][0];

else ans = cnt[t][0];

return ans;

}int main()

scanf("%d%d", &s, &t);

printf("%d\n", dijkstra(s, t));

}return 0;

}

poj3463 最短路和次短路 計數

這道題就是讓你求出有向圖中最短路和比最短路長1的路的數量,我們求出次短路和最短路的數量即可解決這道題 求s到t的最短路與次短路 這裡要求只比最短路多1 的條數之和 聯想到最小,次小的一種更新關係 if x 最小 更新最小,次小 else if 最小 更新方法數 else if x 次小 更新次小 e...

POJ 最短路徑

這兩天做了六道最短路徑的問題,分別用了dijkstra演算法 spfa演算法和floyd演算法,甚至還有一道題用並查集做的也a了,感覺對短路徑已經學得很不錯了。poj1860,poj3259,poj1062,poj2253,poj1125,poj2240 poj2253,dijkstra和並查集都可...

最短路與次短路計數

poj 3464 問最短路的條數 比最短路權值大 1 的條數 做法 比較一下次短路和最短路的值 若次短路恰好比最短路大1,答案為最短路 次短路條數,否則答案就是最短路條數 1 include2 const int inf 0x3f3f3f3f 3 class count short path e m...