bzoj3575 Hnoi2014 道路堵塞

2022-05-15 05:53:27 字數 2915 閱讀 6045

總趕腳第二題總是比第三題難。。。。。。

好吧,這題一點思路都沒有

聽說用民科可以過掉大部分資料。。。。。。

我們發現刪邊後的路徑一定是這樣的:起點->若干個原最短路徑上的邊->若干個非最短路徑上的邊->若干個原最短路徑上的邊->終點

我們發現其實就是不走原最短路徑上的乙個區間,並且刪除的邊一定在這個區間上

我們按順序列舉邊,然後從這條邊的出發點開始跑spfa,不走刪掉的邊(不要取清空dis陣列,這裡是關鍵,dis有單調性)。從該點跑到另乙個最短路上的點p(p必須在所刪的邊之後),然後把整條路徑的長度和p一起加入平衡樹中。出來平衡樹中取出長度最小的邊,若其做對應的p點(最短路)並沒有在所刪的邊之後,該邊刪除。若平衡樹為空,則輸出-1

太流弊啦~~~~

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include適用於cf,uoj,但不適用於poj

using

namespace

std;

typedef

long

long

ll;typedef

double

db;typedef pair

pii;

typedef pair

pdd;

typedef complex

cp;typedef vector

vi;#define mmst(a,v) memset(a,v,sizeof(a))

#define mmcy(a,b) memcpy(a,b,sizeof(a))

#define fill(a,l,r,v) fill(a+l,a+r+1,v)

#define re(i,a,b) for(i=(a);i<=(b);i++)

#define red(i,a,b) for(i=(a);i>=(b);i--)

#define fi first

#define se second

#define mp(a,b) make_pair(a,b)

#define pb(a) push_back(a)

#define sf scanf

#define pf printf

#define two(k) (1<

#define sz(x) (int(x.size()))

#define all(x) (x).begin(),(x).end()

#define ire(i,v,x) for(i=0,v=itemplate

inline t sqr(t x)

template

inline void upmin(t &t,t tmp)

template

inline void upmax(t &t,t tmp)

inline

int sgn(db x)

const db pi=acos(-1.0

);int

gint()

for(;z!=eof && isdigit(z);res=res*10+z-'

0',z=getchar());

return (neg)?-res:res;

}ll gll()

for(;z!=eof && isdigit(z);res=res*10+z-'

0',z=getchar());

return (neg)?-res:res;

}const

int maxn=100100

;const

int maxm=200100

;int

n,m,l;

intnow,info[maxn];

struct tedgeedge[maxm];

inte[maxm],len[maxm],g[maxm],pre[maxm],suc[maxm],pos[maxn],ban[maxm],val[maxn];

void addedge(int u,int v,int cost);info[u]=now;}

multiset

s;int

dis[maxn],ci,vis[maxn];

queue

que;

inttop,sta[maxn];

void spfa(int d,int source,int

lim)

else

if(dis[u]+cost

}re(i,

1,top)s.insert(mp(val[sta[i]],sta[i]));

}int

main()

g[1]=1

; re(i,

1,l)e[i]=gint(),len[i]=edge[e[i]].cost,g[i+1]=edge[e[i]].v;

re(i,

1,l+1)pos[g[i]]=i;

re(i,

2,l+1)pre[i]=pre[i-1]+len[i-1

]; red(i,l,

1)suc[i]=suc[i+1]+len[i];

mmst(dis,

0x3f

); re(i,

1,l)

return0;

}

view code

bzoj3575 Hnoi2014 道路堵塞

一開始看錯題啦!某一條邊不走的最短路相當於1 沿最短路 x y 沿最短路 n,於是 定義t,表示從起點到最短路上序號r有一條長度為l的非最短路。然後用堆維護即可。慎用memset。tle。include include include include include define n 100005 ...

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旅行的人越來越多,這條由交通部指定的...