題目:
輸入
輸出
樣例輸入4 4
1 2 100
2 4 200
2 3 250
3 4 100
輸出這道題要求次短路,我們可以選擇a*,不會spfa來暴力做,但是稍有不慎就會超時,每一點時間都不要浪費。450提示
//最短路:1 -> 2 -> 4 (長度為100+200=300)
第二短路:1 -> 2 -> 3 -> 4 (長度為100+250+100=450)
spfa本來是用來求最短路的,那我們就來變形,把dist改為二維的,第一維存放最短路,第二維放次短路。
如過當前求到的最短路dis
t[v]
[0]+
edge
[i
]dist[v][0]+edge[i]
dist[v
][0]
+edg
e[i]
可以小於以前求到的最短路dis
t[no
w][0
]dist[now][0]
dist[n
ow][
0],那我們就現將現在這個點的次短路也就是以前的最短路更新為次短路的值,再更新最短路的值。
dst[v][1
]=dst[v][0
];dst[v][0
]=dst[now][0
]+eg[i]
;
如過當前求到的值比以前最短路的值大dis
t[v]
[0]+
edge
[i
] st[n ow][ 0] dist[v][0]+edge[i]di st[v ][0] +edg e[i] st[n ow][ 0],但卻又比次短路的值小,我們就將其更新為次短路的值dis t[v] [1 ]>di st[n ow][ 0]+e dge[ i] dist[v][1]>dist[now][0]+edge[i] dist[v ][1] >di st[n ow][ 0]+e dge[ i],我們就直接將其更新為次短路的值dst[v][1
]=dst[now][0
]+eg[i]
;如過當前求到的值不大於以前的最短路但卻又比以前的次短路大dis
t[v]
[1
]>di
st[n
ow][
1]+e
dge[
i]
dist[v][1]>dist[now][1]+edge[i]
dist[v
][1]
>di
st[n
ow][
1]+e
dge[
i],我們就將以前的次短路直接更新為求到的值.
dst[v][1
]=dst[now][1
]+eg[i]
;
還有就是要注意一下這道題用spfa有點勉強,正解還是a*,因為**裡面會用到memset,所以陣列也要卡著開,建議用快讀或scanf,不要用cin,我就深受其害
下面是完整**:
#include
using
namespace std;
/*上面已經講了核心判斷部分,其餘和spfa差不多,
所以就不注釋**了,起始主要還是我懶,~逃*/
int n,m,vis[
5010
],dst[
5010][
2],head[
5010
],nxt[
200010
],to[
200010
],tot,eg[
200010];
intread()
while
(c>=
'0'&&c<=
'9')
return sum*fg;
}void
add(
int x,
int y,
int c)
void
spfa
(int s)}if
(dst[v][1
]>dst[now][0
]+eg[i]
&&dst[v][0
]]+eg[i])}
if(dst[v][1
]>dst[now][1
]+eg[i])}
}}}int
main()
spfa
(n);
cout<[1];
return0;
}
Mod(求模或求餘)
1.求餘 取整除後的餘數,例如 10 mod 4 2 17 mod 4 1 3 mod 4 3 4 mod 3 1 4 mod 3 1 如果a mod b是異號,那麼得出的結果符號與a相同 當然了,a mod b就相當與a a div b b 的運算。例如 13 mod 4 13 13 div 4 ...
關於求模與求餘
我覺得很多人搞不清楚這兩個概念的區別,剛好在翻譯lua手冊時遇到 與math.fmod這兩個操作,順便做一下說明吧。求模與求餘的區別。假設對a與b兩個 整數做求模或求餘操作。那麼第一步是先求整數商c,即 a b 的值,第二步是計算模或餘數 a c b 求模與求餘的區別在於怎麼處理 a b 的值。求模...
求素數,求因數的方法
素數的定義是 自己總結 只能被1和自身整除的數。注意 1.最小的素數是2。2.1 既不是素數也不是合數。3.素數不包括負數。一般的求解素數的方法是 include includeusing namespace std bool isprime int n int main void filterpr...