zoukankan      html  css  js  c++  java
  • 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链

    luogu 1477 [NOI2008] 假面舞会

    容易发现:

    • 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 (3)

    • 如果有环,则面具种数一定是所有环的大小的最大公约数。

    那么只要求出每一个联通块内的最长链与环即可。

    由于是有向边,难以通过有向边判断联通块,因此考虑建立一个反向边。将原来的边边权设为 (1) ,反向边边权设为 (-1)

    ( ext{dfs}) 时记录这个联通块内最大、最小的 (dep) ,相减即为最长链。而如果遇到了已经访问过的点,那么一定有环。

    #include<bits/stdc++.h>
    using namespace std;
    #define infll 0x7f7f7f7f7f7f7f7fll
    #define inf 0x3f3f3f3f
    #define Maxn 100005
    #define Maxm 1000005
    typedef long long ll;
    inline int rd()
    {
    	 int x=0;
         char ch,t=0;
         while(!isdigit(ch = getchar())) t|=ch=='-';
         while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
         return x=t?-x:x;
    }
    int gcd(int x,int y){ return (y==0)?x:gcd(y,x%y); }
    int n,m,tot,ans1,ans2,maxx,minn;
    int dfn[Maxn],hea[Maxn],nex[Maxm<<1],ver[Maxm<<1],edg[Maxm<<1];
    bool vis[Maxn];
    void add(int x,int y,int d){ ver[++tot]=y,nex[tot]=hea[x],hea[x]=tot,edg[tot]=d; }
    void dfs(int x,int Dep)
    {
    	 if(vis[x]) { ans1=gcd(ans1,abs(Dep-dfn[x])); return; }
    	 dfn[x]=Dep,vis[x]=true;
    	 maxx=max(maxx,dfn[x]),minn=min(minn,dfn[x]);
    	 for(int i=hea[x];i;i=nex[i]) dfs(ver[i],Dep+edg[i]);
    }
    int main()
    {
    	 n=rd(),m=rd();
    	 for(int i=1,x,y;i<=m;i++) x=rd(),y=rd(),add(x,y,1),add(y,x,-1);
    	 for(int i=1;i<=n;i++) if(!vis[i])
    	 	 maxx=-inf,minn=inf,dfs(i,0),ans2+=maxx-minn+1;
    	 if(ans1)
    	 {
    	 	 if(ans1<3) printf("-1 -1
    ");
    	 	 else
    	 	 {
    	 	 	 for(int i=3;i<=ans1;i++)
    	 	 	 	 if(ans1%i==0) { printf("%d %d
    ",ans1,i); break; }
    		 }
    	 }
    	 else
    	 {
    	 	 if(ans2<3) printf("-1 -1
    ");
    	 	 else printf("%d 3
    ",ans2);
    	 }
         return 0;
    }
    
  • 相关阅读:
    C#中Linq查询基本操作
    Python中的四种数据结构
    20200917练习题
    SRS搭建自己的直播、点播系统
    20200916练习题
    20200915练习题
    20200914练习题
    20200911练习题
    UTF-8最多编码字符数(最多可以容纳多少数量的字符)?
    k8s新手必看
  • 原文地址:https://www.cnblogs.com/EricQian/p/15293275.html
Copyright © 2011-2022 走看看