題意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...