本題是求最短路和比最短路距離長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...