題目:
好巧妙的轉化!感覺自己難以想出來...
參考了部落格:
把邊變成點,相互之間連邊;
原圖上由乙個點連線的許多邊之間應該通過連新邊達到題目要求的取較大值的目的;
做法就是把乙個原圖點的關聯邊排序,然後較小的邊向較大的邊連邊權為差值的新邊,較大的邊連回去邊權為0的新邊;
那麼如果原圖上要走 a,b 兩條邊,新圖上兩條邊(點)之間有代價,付出代價等價於取較大值;
還要注意原圖是無向圖,連新邊時要連向自己的反向邊,因為新圖連的都是有向邊,所以這樣可以實現原圖中走一條邊移動的效果,也就是兩個原圖點的關聯邊之間也有聯絡;
再建立乙個源點和匯點,1號點的關聯邊都連向源點,連向 n 號點的邊都連向匯點;
然後從源點開始跑最短路,到匯點的最短路就是答案。
**如下:
#include#include#include
#include
#include
using
namespace
std;
typedef
long
long
ll;int
const maxn=1e5+5,maxm=4e5+5
;int n,m,head[maxn],xt=1,hd[maxm],ct=1
,tmp[maxm],t,s,t;
ll dis[maxm];
bool
vis[maxm];
priority_queue
int> >q;//
ll!!!
struct
n}ed[maxm
<<3
],edge[maxm];
void add1(int x,int y,int w)
void add2(int x,int y,int w)
bool cmp(int x,int y)
void
dijkstra()}}
}int
main()
s=1; t=2*(m+1
);
for(int i=1;i<=n;i++)}}
dijkstra();
printf(
"%lld\n
",dis[t]);
return0;
}
P6822 PA2012 Tax 最短路變形
給出乙個 n 個點 m 條邊的無向圖,經過乙個點的代價是進入和離開這個點的兩條邊的邊權的較大值,求從起點 1 到點 n 的最小代價。起點的代價是離開起點的邊的邊權,終點的代價是進入終點的邊的邊權。範圍 性質 1 le n le 10 5,1 le m le 2 times 10 5 暴力做法 由於圖...
BZOJ2748 HAOI2012 音量調節
time limit 3 sec memory limit 128 mb 第一行依次為三個整數 n,beginlevel,maxlevel。第二行依次為n個整數 c1,c2,c3 cn。輸出演奏最後一首歌的最大音量。如果吉他手無法避免音量低於0或者高於maxlevel,輸出 1。3 5 10 5 3...
bzoj 2748 HAOI2012 音量調節
time limit 3 sec memory limit 128 mb submit 1040 solved 673 submit status discuss 第一行依次為三個整數 n,beginlevel,maxlevel。第二行依次為n個整數 c1,c2,c3 cn。輸出演奏最後一首歌的最大...