總趕腳第二題總是比第三題難。。。。。。
好吧,這題一點思路都沒有
聽說用民科可以過掉大部分資料。。。。。。
我們發現刪邊後的路徑一定是這樣的:起點->若干個原最短路徑上的邊->若干個非最短路徑上的邊->若干個原最短路徑上的邊->終點
我們發現其實就是不走原最短路徑上的乙個區間,並且刪除的邊一定在這個區間上
我們按順序列舉邊,然後從這條邊的出發點開始跑spfa,不走刪掉的邊(不要取清空dis陣列,這裡是關鍵,dis有單調性)。從該點跑到另乙個最短路上的點p(p必須在所刪的邊之後),然後把整條路徑的長度和p一起加入平衡樹中。出來平衡樹中取出長度最小的邊,若其做對應的p點(最短路)並沒有在所刪的邊之後,該邊刪除。若平衡樹為空,則輸出-1
太流弊啦~~~~
#include#includeview code#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;
}
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旅行的人越來越多,這條由交通部指定的...