給出一張n個點,m條邊的無向聯通圖,和q次詢問,每次詢問x到y的最短路。
n,q<=10^4,m<=1.2*10^4
時限100ms
10% n<=10^3,m<=1.2*10^3
另外30% n=m+1
另外50% n=m
這題畫風突然就變了。
10%暴力,30%樹,50%換套樹,10%。。。仙人掌!@#¥%……&*
還開100ms,嚇得我都不敢打玄學演算法sp(b)fa了.
不過事實證明出題人不卡。。。
首先我們從root開始跑一遍sp(b)fa
然後把仙人掌變成樹
鏈結乙個把仙人掌變成樹的方法
這樣我們就得到了一顆仙人掌樹(是這樣叫的吧?)
並且這棵樹中的所有環頂(父親)都是兒子的spfa必經點。
那麼對於兩個點x,y,我們我們把他們往上跳,跳到lca的下面,設為a和b。
如果這兩個點不屬於乙個乙個環,那麼答案就是dis[x]+dis[y]-2*dis[lca]
如果屬於,那麼我們就用dis[x]-dis[a]+dis[y]-dis[b]再加上a到b走環的距離(min一下就好了)
infleaking同學竟然比我早a,不爽(*  ̄︿ ̄)
#include
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define rep(i,a) for(int i=last[a];i;i=next[i])
#define n 22005
using namespace std;
int n,m,x,y,z,l,q,tot;
int d[n],c[n],dfn[n],dis[n],cir[n],p[n],len[n];
int t[n*2],v[n*2],next[n*2],last[n],fa[n][17],que[n*5];
bool e[n*2],bz[n];
void add(int
x,int
y,int z)
void spfa()
bz[que[i]]=0;
}}void cate(int s,int t,int line)
}void dfs(int
x) else
if (dfn[t[i]]x]) cate(t[i],x,i);
}void make(int
x,int
y)
int lca(int &x,int &y)
int main()
printf("%d\n",dis[a]+dis[b]-2
*dis[z]);
}}
模擬 NOIP 2013 花匠
花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...
NOI(P)2013模擬 秘密任務
這題是在最短路上研究問題的,所以理所當然要建個圖先。其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。其實這兩題是不同的。所以我在考試時就掛了。因為...
NOIP2013模擬 粉刷匠
給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的 有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。k 15,ci 6,資料組數 2000 這種題一般很難有直接的通式,可以考慮dp。設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。這裡的空指...