BZOJ4116 : [Wf2015]Tours

将边集划分成若干极大不相交集合,满足每个简单环都可以由某些集合相加得到,则答案就是这些集合大小的$\gcd$的约数。

对于一个简单环,上面的边一定不是桥边,而和它在一个集合的边肯定不在其他简单环上。因此删除它之后,这些边就从非桥边变成了桥边。

枚举每条非桥边跑Tarjan计算答案即可。

时间复杂度$O(m(n+m))$。

#include<cstdio>
const int N=2005,BUF=21000;
int n,m,i,x,y,now,ans,D,cut[N],g[N],v[N<<1],nxt[N<<1],ed=1;
int q[N<<1],*st[N],*en[N],dfn[N],low[N],num;char Buf[BUF],*buf=Buf;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void dfs(int x,int y){
  dfn[x]=low[x]=++num;
  for(int*i=st[x];i<en[x];i++){
    int u=(*i)&2047;
    if(u==y)continue;
    if(!dfn[u]){
      dfs(u,x);
      if(low[x]>low[u])low[x]=low[u];
      if(low[u]==dfn[u])cut[(*i)>>12]=1;
    }else if(low[x]>dfn[u])low[x]=dfn[u];
  }
}
void tarjan(int x,int y){
  dfn[x]=low[x]=++num;
  for(int*i=st[x];i<en[x];i++)if(((*i)>>12)!=D){
    int u=*i&2047;
    if(u==y)continue;
    if(!dfn[u]){
      tarjan(u,x);
      if(low[x]>low[u])low[x]=low[u];
      if(low[u]==dfn[u]&&!cut[(*i)>>12])now++;
    }else if(low[x]>dfn[u])low[x]=dfn[u];
  }
}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main(){
  fread(Buf,1,BUF,stdin),read(n),read(m);
  for(i=1;i<=m;i++)read(x),read(y),add(x,y),add(y,x);
  for(i=1;i<=n;i++){
    st[i]=q+num+1;
    for(x=g[i];x;x=nxt[x])q[++num]=x<<11|v[x];
    en[i]=q+num+1;
  }
  for(num=0,i=1;i<=n;i++)if(!dfn[i])dfs(i,0);
  for(D=1;D<=m;D++)if(!cut[D]){
    for(now=i=1,num=0;i<=n;i++)dfn[i]=0;
    for(i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
    if(!ans)ans=now;else ans=gcd(ans,now);
  }
  for(i=1;i<=ans;i++)if(ans%i==0)printf("%d%c",i,i<ans?‘ ‘:‘\n‘);
  return 0;
}

  

时间: 2024-10-26 16:18:34

BZOJ4116 : [Wf2015]Tours的相关文章

[Wf2015]Tours

[Wf2015]Tours 题目 给定一张n个点m条边的无向图,你需要选择一个颜色种类数k,然后用这k种颜色给每条边染色,要求对于图中任意一个简单环,每种颜色的边的数量都相同,求所有可行的k INPUT 第一行两个正整数n,m接下来m行,每行两个正整数x,y(1<=x<y<=n),代表一条无向边数据保证无重边无自环 OUTPUT 一行输出所有可行的k,按递增顺序输出 6 6 1 2 2 3 1 3 1 4 2 5 3 6 SAMPLE INPUT 6 6 1 2 2 3 1 3 1 4

BZOJ 4116 Wf2015 Tours Tarjan

题目大意:给定一张n个点m条边的无向图,你需要选择一个颜色种类数k,然后用这k种颜色给每条边染色,要求对于图中任意一个简单环,每种颜色的边的数量都相同,求所有可行的k 考虑将边集E拆成一些子集{E1,E2,E3,..},满足任意一个简单环可以被拆成一些子集的和,且不存在两个子集合并后仍满足条件,那么答案就是gcd{|E1|,|E2|,|E3|,..}的所有约数 那么如何确定这些子集呢? "尝试删掉每一条非桥边并统计有多少边成为了新的桥边.得到的数+1的gcd."--Petr Touri

BZOJ 4116[WorldFinal2015]Tours

题面: 4116: [Wf2015]Tours Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 129  Solved: 46[Submit][Status][Discuss] Description 给定一张n个点m条边的无向图,你需要选择一个颜色种类数k,然后用这k种颜色给每条边染色,要求对于图中任意一个简单环,每种颜色的边的数量都相同,求所有可行的k Input 第一行两个正整数n,m 接下来m行,每行两个正整数x,y(1<=x<y<=

HP Web Tours分析

1.启动Web Tours 2.首页结构 3.预定机票

URAL 1077 Travelling Tours(统计无向图中环的数目)

Travelling Tours Time limit: 1.0 secondMemory limit: 64 MB There are N cities numbered from 1 to N (1 ≤ N ≤ 200) and M two-way roads connect them. There are at most one road between two cities. In summer holiday, members of DSAP Group want to make so

LR学习笔记7-HP WEB TOURS分析

今天学习LR自带的网站,通过对其分析和掌握,希望对性能测试有更深的 了解. 要学习的三部分: --1--启动web tours --2--分析首页结构 --3--预定机票流程 老规矩,下面我们展开进行系统学习. 1.启动web tours >>启动路径:开始->所有程序->HP LoadRunner->Samples->Web >>启动web tours的服务 >>打开web tours网站 注意:如果web服务器已经启动,在重复启动该服务器会报

USACO 2.4 Cow Tours

Cow Tours Farmer John has a number of pastures on his farm. Cow paths connect some pastures with certain other pastures, forming a field. But, at the present time, you can find at least two pastures that cannot be connected by any sequence of cow pat

Web Tours自带示例网站无法打开的解决方案

问题现象: LoadRunner自带的测试样品,旅行社机票预订系统HP Web Tours以下简称为Web Tours. 1.LoadRunner程序的Sample目录下无Web和Web Tours服务启动项,怎么办? 2.LoadRunner自带的Web测试样品Web Tours打不开或报错,怎么办? 3.LoadRunner自带的Web Tours服务正常运行,访问界面报错HTTP 404错误? 4.LoadRunner自带的Web Tours服务正常运行,访问界面报错HTTP 500错误?

[loadrunner自带网站Web Tours打不开]修改LR自带的示例程序端口号,Cannot create GUI process-program not found

问题: LoadRunner的HP Web Tours应用程序服务启动不了,提示1080端口被占用的问题 与Internal error:your request was unsuccessful Cannot create GUI process-program not found 检查方法: 1.查看占用1080端口的进程 2.查看C盘下是否有strawberry文件夹下,如果没有就需要下载strawberry-perl-5.10.1.0.msi并安装,然后刷新浏览器就可以看到程序成功打开