這道題就是讓你求出有向圖中最短路和比最短路長1的路的數量, 我們求出次短路和最短路的數量即可解決這道題
/*求s到t的最短路與次短路(這裡要求只比最短路多1)的條數之和
聯想到最小,次小的一種更新關係:
if(x《最小)更新最小,次小
else if(==最小)更新方法數
else if(x《次小)更新次小
else if(x==次小)更新方法數
同時記錄s到u最短,次短路及方法數
用乙個堆每次取最小的,更新完後再入堆
還是那個原理,第一次遇到的就是最優的,然後vi標記為真
方法數注意是加法原理,不是乘法
\ -- u -- v 所以是加法原理
/ */
**如下:
#include #include#include
#include
#include
using
namespace
std;
const
int maxn = 1000 + 10
;const
int inf = 0x3f3f3f3f
;int
n, m;
struct edge ;
vector
g[maxn];
ints, f;
struct
dij};
int dist[maxn][2], vis[maxn][2], dp[maxn][2
];void
dijkstra()
);
while(!que.empty()));}
dist[v][
0] =w;
dp[v][
0] =dp[u][flog];
que.push((dij));
}else
if(w == dist[v][0]) //
更新方法數
dp[v][0] +=dp[u][flog];
else
if(w < dist[v][1]) //
更新次短路
); }
else
if(w == dist[v][1]) //
更新方法數
dp[v][1] +=dp[u][flog];}}
}int
main()
);
//g[v].push_back((edge));
} scanf(
"%d%d
", &s, &f);
dijkstra();
if(dist[f][1]-dist[f][0] == 1
) printf(
"%d\n
", dp[f][0]+dp[f][1
]);
else
printf(
"%d\n
", dp[f][0
]); }
return0;
}
POJ 3463 最短路 次短路
本題是求最短路和比最短路距離長1的次短路的個數,於是就用到了dijkstra 主要的改變就是陣列都開到了二維,第二維用來表示是最短路還是次短路 比如d陣列和vis陣列 而cnt陣列使用來訪問最短路和次短路的次數 那麼最外層的迴圈就要到2 n 1次了,其中n 1次是用來求最短路的,還有n次是次短路的 ...
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...