(
題意:給乙個無向圖,兩種操作,刪除一條邊,詢問兩點之間關鍵路徑的數目。
關鍵路徑,即刪除這條邊,兩點就不聯通了。保證圖一直聯通。
解法:先在最後的圖上跑一顆生成樹。每有一條其他的邊,就對路徑上的所有邊+1。所以就存在兩種操作,對某一段-1,查詢某一段上0的個數,就可以用線段樹做了。
//#pragma comment(linker, "/stack:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
#include
#include
//#pragma comment(linker, "/stack:1024000000,1024000000")
using
namespace
std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define inf 1e9
#define debug(a) cout << #a" = " << (a) << endl;
#define debugarry(a, n) for (int i = 0; i < (n); i++)
#define clr(x, y) memset(x, y, sizeof x)
#define ll long long
#define ull unsigned long long
#define for(i,a,b) \
for(i=a;a=b;aconst
int maxn = 1e5+30;
struct sadg[maxn<<1];
int h[maxn],si;
void add(int u,int v)
int siz[maxn] , dep[maxn];
int fa[maxn] , son[maxn] , top[maxn];
int vis[maxn];
mapint>us;
ll hash(int u,int v)
void dfs1(int u,int f,int d)
}int mi[maxn<<2],rs[maxn<<2],col[maxn<<2];
void pushup(int rt)
void pushdown(int rt)
}void build(int l,int r,int rt)
int m=l+r>>1;
build(lson);
build(rson);
pushup(rt);
}void update(int l,int r,int d,int l,int r,int rt)
pushdown(rt);
int m=l+r>>1;
if( l <= m ) update(l,r,d,lson);
if( m < r ) update(l,r,d,rson);
pushup(rt);
}int query(int l,int r,int l,int r,int rt)
int query(int u,int v)
if(u==v) return ret;
if( dep[u] > dep[v] ) swap(u,v);
ret += query(p[son[u]],p[v],1,pos-1,1);
return ret;
}void change(int u,int v,int d)
if(u==v) return ;
if( dep[u] > dep[v] ) swap(u,v);
update(p[son[u]],p[v],d,1,pos-1,1);
}void init()
int a[maxn],b[maxn],c[maxn];
int main()
for(int i=0;iscanf("%d%d%d",&a[i],&b[i],&c[i]);
if(a[i]==1) us[hash(b[i],c[i])]--;
}dfs1(1,-1,1);
dfs2(1,1);
build(1,pos-1,1);
for(int u=1;u<=n;u++)}}
printf("case #%d:\n",++case);
vector
ans;
for(int i=q-1;i>=0;i--)
for(int i=ans.size()-1;i>=0;i--)
printf("%d\n",ans[i]);
}return
0;}
hdu 5458 樹鏈剖分模板
題意 給出一張n個點,m條邊的無向圖,有兩個操作 1.刪除 u,v 間的一條邊 2.如果刪除 u,v 間的一條邊可使其不連通,找出這樣的邊的個數,就是找 u,v 間橋的個數 思路 首先離線這些操作,時光倒流從最終狀態逆著加邊加回原圖,可以考慮用並查集建樹,然後以樹作為最終狀態,再樹鏈剖分預處理下,建...
樹鏈剖分 樹鏈剖分講解
好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...
HDU3966 樹鏈剖分
題目 aragorn s story 題意 給一棵樹,並給定各個點權的值,然後有3種操作 i c1 c2 k 把c1與c2的路徑上的所有點權值加上k d c1 c2 k 把c1與c2的路徑上的所有點權值減去k q c 查詢節點編號為c的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...