n個星球,m條邊,q個操作。
(1)破壞一條邊;
(2)詢問兩個星球之間的關鍵路徑的條數(即為乙個星球到另乙個星球的必經之路)。
資料範圍:
30%,n<=100,m<=500,q<=100;
60%,n<=10000,m<=30000,q<=20000,資料中沒有刪邊操作;
100%,n<=30000,m<=100000,q<=40000,資料保證任何時候圖都是連通,且沒有重邊和自環;
思路:30暴力,這裡不多說了;
60就有意思了,操作的題目常常是順著進行維護難而倒著來操作會簡單很多。(正難則反)
倒著來時,就是先將要破壞的邊變成加邊,即會出現樹的形狀(不需要解釋了…),60分則隨機生成這顆樹,因為60分沒刪邊。
100其實就多了最小生成樹,但這樣的話,加邊就不單純了,加邊時,當出現環時,那麼這就不是關鍵路徑了,所以就要路徑壓縮一下——並查集。
#include
#define rep(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define drep(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define root 1,n,1
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define family tree[p],tree[p<<1],tree[p<<1|1]
#define ll long long
#define inf 0x3f3f3f3f
#define n 100005
#define m 200005
#define s 19
#define w 40005
using
namespace
std;
int n,m,mm,q,t;
int ans[m];
bool vis[n];
int lt[n],rt[n],dfslist[n],d[n];//dfs
int fa[n],fa[s][n];// pcs lca
vector
e[m];//dfs
setes[m];//add edge
struct nodea[m],b[m];
struct treetree[n<<2];
void build(int l,int r,int p)
int mid=(l+r)>>1;
build(lson),build(rson);
}void update(int l,int r,int p)
int mid=(tree[p].l+tree[p].r)>>1;
if(r<=mid)update(l,r,p<<1);
else
if(l>mid)update(l,r,p<<1|1);
else update(lson),update(rson);
}int query(int x,int p)
}tree;
struct lca
void init()
}lca;
struct pcs
void up(int &x)
void addedge(int x,int y)
void init()
}pcs;
void dfs(int x,int f) // find link
dfs(y,x);
}rt[x]=t;
}void rd()
rep(i,1,q)
}void solve()
}void pr()
int main()
小結:
dfs序->找到符合線段樹的一種排列
線段樹查詢+修改
倍增求lca,並查集加邊。
無人機航線規劃
給出無人機的起點0的座標 x0,y0 偵察點的數量n,無人機的航程m,以及各偵察點i的座標 xi,yi 請輸出覆蓋最多偵察點的路徑中航程最短的路徑。若路徑有多個,輸出字典序最大的路徑。計算距離時請保留到小數點後兩位。輸入格式 n mx0 y0 x1 y1 x2 y2 xn yn 對於40 的資料,0...
AHOI2005 航線規劃
點此看題 題意 略 說明 提示 我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。資料範圍 1 n 30000,1 m 100000,1 q 40000 1 leq n leq 30000,1 leq m leq 100000...
AHOI2005 航線規劃
給乙個n個點m條邊的圖,有兩種操作 詢問x到y的路徑必經的邊有幾條,刪除x,y之間的直接連邊。1 n 30000,1 m 100000,操作總數不超過40000 我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。必經邊就是橋 ...