一開始看錯題啦!
某一條邊不走的最短路相當於1--沿最短路-->x-->……-->y--沿最短路-->n,於是
定義t,表示從起點到最短路上序號r有一條長度為l的非最短路。然後用堆維護即可。(慎用memset。。)tle。。。
#include#include#include#include#include#define n 100005
using namespace std;
int n,m,l,x,y,z,ord[n],l2[n],a[n];
int first[n],next[n<<1],frm[n<<1],to[n<<1],len[n<<1],l;
int q[n],val[n],st[n],h,dis[n];
bool fl[n],inq[n];
struct t;
bool operator<(t a,t b)
priority_queues;
void link(int x,int y,int z)
void spfa(int u,int v,int k)
else
if (dis[y]>dis[x]+len[i])
}} for (int t;h;h--) t=st[h],s.push((t)),fl[t]=0;
}int main()
{ scanf("%d%d%d",&n,&m,&l);
for (int i=1;i<=m;i++)
scanf("%d%d%d",&x,&y,&z),link(x,y,z);
ord[1]=1;
for (int i=1;i<=l;i++)
scanf("%d",&a[i]),ord[to[a[i]]]=i+1;
for (int i=l;i>=1;i--)
l2[frm[a[i]]]=l2[to[a[i]]]+len[a[i]];
memset(dis,0x3f,sizeof dis);dis[1]=0;
for (int i=1;i<=l;i++)
{ int u=frm[a[i]],v=to[a[i]];
for (spfa(u,v,a[i]);!s.empty()&&s.top().r
bzoj3575 Hnoi2014 道路堵塞
總趕腳第二題總是比第三題難。好吧,這題一點思路都沒有 聽說用民科可以過掉大部分資料。我們發現刪邊後的路徑一定是這樣的 起點 若干個原最短路徑上的邊 若干個非最短路徑上的邊 若干個原最短路徑上的邊 終點 我們發現其實就是不走原最短路徑上的乙個區間,並且刪除的邊一定在這個區間上 我們按順序列舉邊,然後從...
bzoj3575 Hnoi2014 道路堵塞
題目鏈結 給出乙個有向圖和一條最短路,問最短路上任意一條邊斷掉,此時的最短路是多少。聽說這道題正解被江哥插了。右轉題解 lmy學長 平衡樹用堆就可以了。用棧來存要加入堆中的點,不然不好消除標記。bzoj3575 include include include include include incl...
bzoj3575 最短路 SPFA 道路堵塞
description a國有n座城市,依次標為1到n。同時,在這n座城市間有m條單向道路,每條道路的長度是乙個正整數。現在,a國 交通部指定了一條從城市1到城市n的路徑,並且保證這條路徑的長度是所有從城市1到城市n的路徑中最短的。不幸 的是,因為從城市1到城市n旅行的人越來越多,這條由交通部指定的...