[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
2 5
3 6

OUTPUT

1 3

解题报告

其实这道题的关键在于找到每个简单环的边数,所以我们考虑如何处理简单环

显然,在一个简单环中,删去一条边,剩下的边就会变为割边

所以就可以得出做法:枚举原图非桥边,删去该边,处理出新增的桥边数量,所有数量+1的$GCD$所有的因数即为答案

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 inline int read(){
 6     int sum(0);char ch(getchar());
 7     for(;ch<‘0‘||ch>‘9‘;ch=getchar());
 8     for(;ch>=‘0‘&&ch<=‘9‘;sum=sum*10+(ch^48),ch=getchar());
 9     return sum;
10 }
11 int n,m,tot,ans(-1);
12 int dfn[2005],low[2005],cnt,tmp;
13 int fro[2005],to[2005];
14 bool bridge[2005],vis[2005];
15 struct edge{
16     int e,id;
17     edge *n;
18 }*pre[2005],a[4005];
19 inline void insert(int s,int e,int id){
20     a[++tot].e=e;
21     a[tot].id=id;
22     a[tot].n=pre[s];
23     pre[s]=&a[tot];
24 }
25 inline void init(){
26     memset(pre,NULL,sizeof(pre));
27     memset(dfn,0,sizeof(dfn));
28     memset(low,0,sizeof(low));
29     tot=cnt=tmp=0;
30 }
31 inline void tarjan(int u,int fa){
32     dfn[u]=low[u]=++cnt;
33     for(edge *i=pre[u];i;i=i->n){
34         int e(i->e);if(e==fa)continue;
35         if(!dfn[e]){
36             tarjan(e,u);
37             low[u]=min(low[u],low[e]);
38             if(low[e]>dfn[u])bridge[i->id]=1;
39         }
40         else low[u]=min(low[u],dfn[e]);
41     }
42 }
43 inline void dfs(int u,int fa){
44     dfn[u]=low[u]=++cnt;
45     for(edge *i=pre[u];i;i=i->n){
46         int e(i->e);if(e==fa)continue;
47         if(!dfn[e]){
48             dfs(e,u);
49             low[u]=min(low[u],low[e]);
50             if(low[e]>dfn[u]&&bridge[i->id]==0)++tmp,vis[i->id]=1;
51         }
52         else low[u]=min(low[u],dfn[e]);
53     }
54 }
55 inline int gcd(int x,int y){
56     return x%y?gcd(y,x%y):y;
57 }
58 int main(){
59     n=read();m=read();
60     for(int i=1;i<=m;++i){
61         int x(read()),y(read());
62         fro[i]=x;to[i]=y;
63         insert(x,y,i);insert(y,x,i);
64     }
65     for(int i=1;i<=n;++i)
66         if(!dfn[i])
67             tarjan(i,0);
68     for(int i=1;i<=m;++i){
69         if(bridge[i]||vis[i])continue;
70         init();
71 //      for(int j=1;j<=m;++j)cout<<j<<‘ ‘<<bridge[j]<<endl;cout<<endl;//cout<<"ban "<<i<<endl;
72         for(int j=1;j<=m;++j)
73             if(j^i){//cout<<j<<‘ ‘<<fro[j]<<‘ ‘<<to[j]<<endl;
74                 insert(fro[j],to[j],j);
75                 insert(to[j],fro[j],j);
76             }
77         for(int j=1;j<=n;++j)
78             if(!dfn[j])
79                 dfs(j,0);
80 //      for(int j=1;j<=m;++j)cout<<j<<‘ ‘<<bridge[j]<<endl;cout<<endl;
81         if(ans==-1)ans=tmp+1;
82         else ans=gcd(ans,tmp+1);
83 //      cout<<tmp<<‘ ‘<<ans<<endl;
84     }
85 //  cout<<ans<<endl;
86     for(int i=1;i<=ans;++i)
87         if(ans%i==0){
88             printf("%d",i);
89             if(i^ans)putchar(‘ ‘);
90         }
91 }

时间: 2024-10-21 11:35:56

[Wf2015]Tours的相关文章

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<

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并安装,然后刷新浏览器就可以看到程序成功打开