2017.7.10 noi2008 假面舞会
来源:互联网 发布:Windows安装Python 编辑:程序博客网 时间:2024/04/28 12:31
首先,可以把每个人看成一个点,能看见谁就相当于两个人之间有一个单向边,这样就可以把关系看成几个连通图。
对于每个连通图,有三种情况:
1.所有边数之和的最大公约数
2.正向边和反向边差的绝对值的最大公约数
3.是一条链
记录的时候可以把正向边记为+1,反向边记为-1,遍历的时候只要记录图中的加和 就可以得知前两种情况,然后取gcd就是max,min是最小的、大于3的、max的约数。
如果在最后没有找到环,说明只有链能限制,这时就算出每个连通图中最长链,然后加和为max,min就是3了。
而如果有环,那么只能按环算,因为链无论如何也能满足,而环不行。
最后附上代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int read()#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int read(){int ans=0;char q=getchar();while(q<'0'||q>'9')q=getchar();while(q>='0'&&q<='9'){ans=ans*10+q-'0';q=getchar();}return ans;}int gcd(int x,int y){return y==0?x:gcd(y,x%y);}int abss(int x){return x<0?-x:x;}int maxn(int a,int b){return a>b?a:b;}int minn(int a,int b){return a<b?a:b;}struct son{int v,next,w;};son a1[6000001];int first[6000001],e;void addbian(int u,int v,int w){a1[e].w=w;a1[e].v=v;a1[e].next=first[u];first[u]=e++;}int n,m,u,o;int vis[600001];int ans;int w[600001];int maxl,minl;void dfs(int fa,int x,int val){vis[x]=1;w[x]=val;for(int i=first[x];i!=-1;i=a1[i].next){int temp=a1[i].v;if(temp==fa)continue;if(vis[temp]){if(val==0)continue;ans=gcd(ans,abss(val+a1[i].w-w[temp]));continue;}dfs(x,temp,val+a1[i].w);}}void dfs2(int fa,int x,int val){vis[x]=1;maxl=maxn(maxl,val);minl=minn(minl,val);for(int i=first[x];i!=-1;i=a1[i].next){int temp=a1[i].v;if(vis[temp]||temp==fa)continue;dfs2(x,temp,val+a1[i].w);}}int main(){mem(first,-1);n=read();m=read();for(int i=1;i<=m;++i){u=read();o=read();addbian(u,o,1);addbian(o,u,-1);}for(int i=1;i<=n;++i){if(vis[i])continue;dfs(-1,i,0);}if(ans){if(ans<3) printf("-1 -1");else{printf("%d ",ans);for(int i=3;i<=ans;++i) if(!(ans%i)) { printf("%d",i);break;}}}else{mem(vis,0);for(int i=1;i<=n;++i){if(vis[i])continue;printf("i=%d\n",i);maxl=minl=0;dfs2(-1,i,0);ans+=(maxl-minl+1);}if(ans<3) printf("-1 -1");else printf("%d 3",ans);}while(1);return 0;}
{int ans=0;char q=getchar();while(q<'0'||q>'9')q=getchar();while(q>='0'&&q<='9'){ans=ans*10+q-'0';q=getchar();}return ans;}int gcd(int x,int y){return y==0?x:gcd(y,x%y);}int abss(int x){return x<0?-x:x;}int maxn(int a,int b){return a>b?a:b;}int minn(int a,int b){return a<b?a:b;}struct son{int v,next,w;};son a1[6000001];int first[6000001],e;void addbian(int u,int v,int w){a1[e].w=w;a1[e].v=v;a1[e].next=first[u];first[u]=e++;}int n,m,u,o;int vis[600001];int ans;int w[600001];int maxl,minl;void dfs(int fa,int x,int val){vis[x]=1;w[x]=val;for(int i=first[x];i!=-1;i=a1[i].next){int temp=a1[i].v;if(temp==fa)continue;if(vis[temp]){if(val==0)continue;ans=gcd(ans,abss(val+a1[i].w-w[temp]));continue;}dfs(x,temp,val+a1[i].w);}}void dfs2(int fa,int x,int val){vis[x]=1;maxl=maxn(maxl,val);minl=minn(minl,val);for(int i=first[x];i!=-1;i=a1[i].next){int temp=a1[i].v;if(vis[temp]||temp==fa)continue;dfs2(x,temp,val+a1[i].w);}}int main(){mem(first,-1);n=read();m=read();for(int i=1;i<=m;++i){u=read();o=read();addbian(u,o,1);addbian(o,u,-1);}for(int i=1;i<=n;++i){if(vis[i])continue;dfs(-1,i,0);}if(ans){if(ans<3) printf("-1 -1");else{printf("%d ",ans);for(int i=3;i<=ans;++i) if(!(ans%i)) { printf("%d",i);break;}}}else{mem(vis,0);for(int i=1;i<=n;++i){if(vis[i])continue;printf("i=%d\n",i);maxl=minl=0;dfs2(-1,i,0);ans+=(maxl-minl+1);}if(ans<3) printf("-1 -1");else printf("%d 3",ans);}while(1);return 0;}
阅读全文
0 0
- 2017.7.10 noi2008 假面舞会
- NOI2008 假面舞会party
- [BZOJ1064][Noi2008]假面舞会
- 【BZOJ1064】【NOI2008】假面舞会
- [bzoj1064][NOI2008]假面舞会
- BZOJ1064: [Noi2008]假面舞会
- [Noi2008]假面舞会
- 1064: [Noi2008]假面舞会
- bzoj 1064: [Noi2008]假面舞会
- 【BZOJ 1064】 [Noi2008]假面舞会
- 【bzoj1064】 NOI2008 假面舞会 图论好题
- 【bzoj1064】【NOI2008】【假面舞会】【dfs】
- [BZOZ1064][NOI2008]假面舞会 图论
- [图论杂题] BZOJ1064: [Noi2008]假面舞会
- 【图的遍历】【NOI2008】假面舞会
- BZOJ 1064 NOI2008 假面舞会 DFS
- 【BZOJ1064】[Noi2008]假面舞会【DFS】【分类讨论】
- [bzoj-1064] [Noi2008]假面舞会 题解
- PythonWeb开发Django框架学习(十二)基础总结
- strong与weak
- 按下电源键到启动Home应用过程详解(三)
- 【比特币】搭建虚拟币开发核心运行环境
- poj 3278
- 2017.7.10 noi2008 假面舞会
- 运行caffe版(python)faster RCNN
- POJ 1276Cash Machine(多重背包 + 二进制优化)
- 909422229_Oracle条件语句
- linux下iperf的使用
- DepOps方案Docker+Jenkins+GitHub实践
- Spring学习笔记(六)
- new begin
- 时间复杂度的计算(基础不牢,地动山摇)