我们根据能否看见建图,有向图边权设成1,然后我们转成无向图,

对于每条有向边连一条反边,边权是-1,然后从每个块中任意一个点开始

dfs,每个点有一个值,经过一条边到另一个点之后,用原来的点值和边权

更新新的点的点值,那么如果我们访问到了一个原来已经走过的点,那么我们

找到了一个环(可能是非环,就是一个点出两条有向边,然后又交在一点了),由于

数据是合法的,所以这样的非环的现在应该更新成的点值和原有的点值相等,如果不相等

的话,取差值的绝对值,就是这个环的长度。

那么我们对于所有块,每个块的环的长度都是种类数的倍数,所以取gcd就好了

还有一种情况就是没有环,全都是以链的形式存在的,对于这种形式,我们每个块

染色,然后找到每个块中点值最大的最小的差值就是最长链的长度。

无解的情况比较容易讨论,在此不再赘述。

/**************************************************************
    Problem:
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time: ms
    Memory: kb
****************************************************************/
 
{$M 65536000} 
//By BLADEVIL
var
    n, m                            :longint;
    pre, other, len                 :array[..] of longint;
    last                            :array[..] of longint;
    l                               :longint;
    flag                            :array[..] of boolean;
    size, father, key, tmin, tmax   :array[..] of longint;
    g                               :array[..] of longint;
    ans1, ans2                      :longint;
   
       
procedure swap(var a,b:longint);
var
    c                               :longint;
begin
    c:=a; a:=b; b:=c;
end;
       
function min(a,b:longint):longint;
begin
    if a>b then min:=b else min:=a;
end;
   
function max(a,b:longint):longint;
begin
    if a>b then max:=a else max:=b;
end;
   
function gcd(a,b:longint):longint;
begin
    if b>a then swap(a,b);
    if b= then exit(a) else exit(gcd(b,a mod b));
end;
       
procedure connect(x,y,z:longint);
begin
    inc(l);
    pre[l]:=last[x];
    last[x]:=l;
    other[l]:=y;
    len[l]:=z;
end;
   
procedure dfs(x:longint);
var
    q, p                            :longint;
begin
    flag[x]:=true;
    q:=last[x];
    while q<> do
    begin
        p:=other[q];
        if len[q]= then father[p]:=x;
        if not flag[p] then
        begin
            flag[p]:=true;
            size[p]:=size[x]+len[q];
            key[p]:=key[x];
            dfs(p);
        end else
        begin
            inc(g[]);
            g[g[]]:=abs(size[x]+len[q]-size[p]);
            if g[g[]]= then dec(g[]);
        end;
        q:=pre[q];
    end;
end;
       
procedure init;
var
    i                               :longint;
    x, y                            :longint;
begin
    read(n,m);
    for i:= to m do
    begin
        read(x,y);
        connect(x,y,);
        connect(y,x,-);
    end;
    for i:= to n do father[i]:=-;
    for i:= to n do if not flag[i] then dfs(i);
end;
   
procedure main;
var
    i                               :longint;
begin
    if g[]= then
    begin
        fillchar(flag,sizeof(flag),false);
        for i:= to n do if (father[i]=-) and (key[i]=) then
        begin
            key[i]:=i;
            dfs(i);
        end;
        for i:= to n do tmax[i]:=-maxlongint;
        for i:= to n do tmin[i]:=maxlongint;
        for i:= to n do
        begin
            tmax[key[i]]:=max(tmax[key[i]],size[i]);
            tmin[key[i]]:=min(tmin[key[i]],size[i]);
        end;
        for i:= to n do if tmin[i]<>maxlongint then inc(ans1,tmax[i]-tmin[i]+);
        if ans1< then
        begin
            writeln(-,' ',-);
            exit;
        end else
        begin
            writeln(ans1,' ',);
            exit;
        end;
    end else
    begin
        ans1:=g[];
        for i:= to g[] do
            ans1:=gcd(ans1,g[i]);
        if ans1< then
        begin
            writeln(-,' ',-);
            exit;
        end else
        begin
            ans2:=;
            for i:= to ans1 do
                if ans1 mod i= then
                begin
                    ans2:=i;
                    break;
                end;
            if ans2= then ans2:=ans1;
            writeln(ans1,' ',ans2);
        end;
    end;
end;
   
begin
    init;
    main;
end.

bzoj 1064 图论的更多相关文章

  1. BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...

  2. bzoj 1064 假面舞会 图论??+dfs

    有两种情况需要考虑 1.链:可以发现对最终的k没有影响 2.环:如果是真环(即1->2->3->4->1),可以看出所有可行解一定是该环的因数 假环呢??(1->2-&g ...

  3. BZOJ 1064 假面舞会(NOI2008) DFS判环

    此题,回想Sunshinezff学长给我们出的模拟题,原题啊有木有!!此处吐槽Sunshinezff爷出题不人道!! 不过也感谢Sunshinezff学长的帮助,我才能做出来.. 1064: [Noi ...

  4. bzoj 1064

    题意:戳这里 思路:很明显是一个图论模型.. 就两种图形: 1.图中存在环,那么就是所有环的gcd为最大答案.gcd的大于3的最小约数为最小答案 2.不存在环,那么是每个弱连通块的最长链之和为最大答案 ...

  5. [bzoj 1064][NOI2008]假面舞会(dfs判断环)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1064 分析: 如果a看到b,则a->b 那么: 1.如果图中有环,则说明这个环的 ...

  6. bzoj 1064【noi2008】假面舞会

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1064 给一个有向图染色,每个点的后继必须相同,问至少&至多有多少种染色方案 sol: ...

  7. BZOJ 1064 假面舞会

    http://www.lydsy.com/JudgeOnline/problem.php?id=1064 思路:第一眼看的时候以为是差分约束,但是是做不了的,不过能保证的就是这题绝对是图论题...(废 ...

  8. [BZOJ]1064: [Noi2008]假面舞会

    题目大意:n个人,k种假面,每人戴一种,戴第i种的可以看见第i+1种,戴第k种的可以看见第1种,给出m条关系表示一个人可以看到另一个人,问k可能的最大值和最小值.(n<=100,000,m< ...

  9. bzoj 1064 noi2008 假面舞会题解

    莫名其妙的变成了我们的noip互测题... 其实这题思想还是比较简单的,只是分类不好分而已 其实就是一个dfs的事 首先,非常明显,原题目中的所有关系可以抽象成一个图(这是...显而易见的吧...) ...

随机推荐

  1. 自学MVC开发基础

    由于现在面试需求,我必须有点了解MVC开发基础,MVC是一个开发框架或者是一个开发模式,MVC让软件开发的过程大致切割成三个单元,分别是:Model(模型).View(试图).Controller(控 ...

  2. 孤荷凌寒自学python第七十天学习并实践beautifulsoup对象用法3

    孤荷凌寒自学python第七十天学习并实践beautifulsoup对象用法3 (完整学习过程屏幕记录视频地址在文末) 今天继续学习beautifulsoup对象的属性与方法等内容. 一.今天进一步了 ...

  3. 在阿里云上遇见更好的Oracle(二)

    从上一篇文章的反馈来看,大家还是喜欢八卦多过技术细节,那这一篇继续一些题外话,说说我对“去IOE”的看法. 对同一件事情,参与的没参与的人,讨论起来,都会有各自的立场.所以这里先申明一下,以下内容只是 ...

  4. 机器学习 (一) 单变量线性回归 Linear Regression with One Variable

    文章内容均来自斯坦福大学的Andrew Ng教授讲解的Machine Learning课程,本文是针对该课程的个人学习笔记,如有疏漏,请以原课程所讲述内容为准.感谢博主Rachel Zhang的个人笔 ...

  5. java设计模式之门面模式以及在java中作用

    门面模式在Tomcat中有多处使用,在Request和Response对象封装,从ApplicationContext到ServletContext封装中都用到了这种设计模式. 一个系统可以有几个门面 ...

  6. linux备忘录-程序管理与SELinux

    知识点 程序与程序(Process and Program) 通过执行一条指令或程序,则可以触发一个事件,并获得一个PID.当我们需要启动一个程序时,我们是启动一个二进制文件(binary file) ...

  7. 学习bash——数据流重定向

    一.概述 1. 数据流 定义:以规定顺序被读取一次的数据序列. 分类:标准输入(stdin).标准输出(stdout)和标准错误输出(stderr). 标准输出:指的是命令执行所回传的正确信息. 标准 ...

  8. PM所该学习的

     最近第二阶段实在大家都是大一大二,面临的考试很多也很难,很多时候就开始松懈了下来.可是做事情就是需要效率和时间,慢慢地,也开始懈怠了下来. 作为pm,首先自己必须比组员先了解云笔记的各种进程,做好沟 ...

  9. 在delphi中如何解决空格的问题。。。。烦死 了。。。。

    我每次从数据库里面取数据出来和Edit里面的进行比较的时候总是会受到空格的困扰...老是干扰我...如果我用trim 所有都做去掉所有的空格那么这样就非常麻烦又繁琐..有没有什么方法可以忽略空格的.. ...

  10. (转)String,StringBuffer与StringBuilder的区别??

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...