Breaking Good(最短路 記錄路徑)

2022-06-18 14:12:11 字數 1570 閱讀 2153

題意n個點,m條路,路長度都是1,每條路有壞的(1)、有好的(0),逃犯要找出從 1 到 n 的最短路徑(不管路是好是壞),同時將不是最短路徑上的路炸壞掉(如果這條路本身就是壞的就不用炸),還要將最短路徑上的壞的路修好(本來就是好的路不用修),如果最短路徑有多條,選下力氣最少的哪一條路徑(即 需要炸毀的路數 + 需要修的路數的 和最小),輸出最小力氣(需要炸毀的路數 + 需要修的路數的 和),同時輸出具體哪些路需要被修或者被炸毀。

思路跑最短路,記錄標記最短路徑,然後列舉每條路,看是不是最短路徑上的路,同時判斷需不需輸出。

(這裡介紹一下 ^ 運算子的作用是 偶數++ 奇數–,用的時候最好帶括號,我就是沒帶括號所以寫部落格長長腦子o(╥﹏╥)o)

(可真就是每日一錯唄o(╥﹏╥)o)

**

#include

#include

#include

#include

#include

#define pii pair

#define inf 0x3f3f3f3f

using

namespace std;

const

int maxn=

1e5+10;

int n,m,tot,head[maxn]

,pre[maxn]

,dis[maxn]

,cnt[maxn]

,sum,ans;

bool vis[maxn]

,v[maxn]

;struct node

p[maxn]

;struct node

edge[maxn<<1]

;void

init()

void

add(

int u,

int v,

int w,

int z)

void

dijkstra()

else

if(dis[v]

==dis[now]

+edge[i]

.w)}}}

}int

main()

dijkstra()

;int pos=n;v[1]

=v[n]=1

;while

(pre[pos]

!=pos)

ans=sum+cnt[n]

+cnt[n]

;//需要操作的路=(最短路徑以外好的路+最短路徑以內壞的路)

//=( 總好的路—(最短路徑上總的路-最短路徑上壞的路)+ 最短路徑上壞的路)

printf

("%d\n"

,ans)

;for

(int i=

1;i<=m;i++

)else

if(p[i]

.z==1)

//不在最短路徑上,需要炸

printf

("%d %d 0\n"

,p[i]

.x,p[i]

.y);

}//輸出的時候 1 被修 0 被炸

return0;

}

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

最短路徑演算法 最短路

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

最短路(最短路之積)

首先考慮暴力維護,顯然極端資料就會炸裂,那麼用什麼來維護呢?考慮乙個很 nb的公式log n m log n log m ok,這道題到此結束 我們只要把乘積轉化為對數,最後再還原就可以了,也不用考慮精度問題,本蒟蒻試著用pow,然後它死了。includeusing namespace std co...