codeforces1800,codeforces.m1

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: