codeforces1800,codeforces.m1
题意:给一个n个点的无向图,m条双向边,保证没有重边和自环,图连通,有q个询问,给两个点,S和t,问从S到T有多少条割边。
思路:看到这题第一反应就是求双连通分量,然后缩点,因为在同一个双连通分量内肯定没有割边,然后缩点后原图就变成了一棵树,因为保证原图连通,所以得到的也只有一颗树,树中的边即为原图中的割边,于是问题就转化成求树中两点的距离了,用[军[商务英语着陆飞机即可解决。先贴一个代码。
#包括输入输出流
#包含字符串。h
#包含标准视频
#包含算法
#定义maxn 100010
使用命名空间标准
结构边缘
(同Internationalorganizations)国际组织到;
int next
整数
} e[3][maxn 2];
int box[3][maxn],CNT[3];
空的初始化()
memset(box,-1,sizeof(box));
memset(cnt,0,sizeof(CNT));
void add(int from,int to,int num,int t)
e[t][cnt[t]].到=到
e[t][cnt[t]].数字=数字
e[t][cnt[t]].next=box[t][from];
box[t][from]=CNT[t];
int pre[maxn];
int low[maxn];
int bridge[maxn];
int bcnt=0;
int cnt0
void bridge_search(int now,int fa)
int t;
int v,w;
low[now]=pre[now]=CNT 0;
for(t=box[0][now];t1;t=e[0][t].下一个)
v=e[0][t].到;
如果(v==fa)
继续;
如果(!先行词
桥_搜索(v,现在);
如果(低[v]低[现在])
低[现在]=低[v];
if(low[v] pre[now])
桥[e]t .num]=1;
其他
if(low[now] pre[v])
低[现在]=前[v];
(同Internationalorganizations)国际组织桥(整数)
int I;
cnt0=0
memset(pre,0,sizeof(pre));
memset(low,0,sizeof(low));
memset(bridge,0,sizeof(bridge));
bcnt=0;
for(I=1;我我)
如果(!pre[i])
bridge_search(i,0);
返回位计数器
int vis[maxn];
int dist[maxn];
作废Dfs(现在整数,整数)
low[now]=num;
vis[now]=1;
int t,v,nn;
for(t=box[0][now];t1;t=e[0][t].下一个)
v=e[0][t].to,nn=e[0][t].数字
如果(桥[nn])
继续;
如果(!视觉,视觉
Dfs(v,num);
void solve(int n)//宋体
int i,sum=0;
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
for(I=1;我我)
如果(!低[我])
Dfs(i,sum);
for(I=1;我我)
int t,v;
for(t=box[0][I];t1;t=e[0][t].下一个)
v=e[0][t].到;
如果(低[我]!=低[v])
添加(低[我],低[v],0,1);
添加(低[v],低[i],0,1);
void dfs(int now,int deep)
dist[now]=deep;
vis[now]=1;
int t,v;
for(t=box[1][now];t1;t=e[1][t].下一个)
v=e[1][t].到;
如果(!视觉,视觉
dfs(v,深1);
int f[maxn];
空的有限(整数)
int I;
for(I=0;我我)
f[I]=I;
int find(int x)
if(x==f[x])
返回x;
return f[x]=find(f[x]);
int ans[maxn];
无效生命周期评估(即时)
f[现在]=现在;
vis[now]=1;
int t,v,x;
for(t=box[1][now];t1;t=e[1][t].下一个)
v=e[1][t].到;
如果(!视觉,视觉
生命周期评估(五);
f[v]=现在;
for(t=box[2][now];t1;t=e[2][t].下一个)
v=e[2][t].to,x=e[2][t].数字
if(vis[v]==2)
int TT=find(v);
ans[x]=dist[now]dist[v]-2 * dist[TT];
vis[now]=2;
int main()
//freopen(dd.txt , r ,stdin);
int n,m,I,a,b,q;
scanf(%d%d ,n,
init();
for(I=1;我我)
scanf(%d%d ,a,
add(a,b,I,0);
add(b,a,I,0);
memset(ans,0,sizeof(ans));
桥(n);
求解(n);
memset(vis,0,sizeof(vis));
dfs(1,0);
scanf(%d ,
for(I=1;我我)
scanf(%d%d ,a,
如果(低【答】!=低[b])
添加(低[a],低[b],I,2);
添加(低[b],低[a],我,2);
memset(vis,0,sizeof(vis));
LCA(1);
for(I=1;我我)
printf(%d\n ,ans[I]);
返回0;
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。