• 1064: [Noi2008]假面舞会


    Description

    一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会。今年的面具都是主办方特别定制的。每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具。每个面具都有一个编号,主办方会把此编号告诉拿该面具的人。为了使舞会更有神秘感,主办方把面具分为k (k≥3)类,并使用特殊的技术将每个面具的编号标在了面具上,只有戴第i 类面具的人才能看到戴第i+1 类面具的人的编号,戴第k 类面具的人能看到戴第1 类面具的人的编号。 参加舞会的人并不知道有多少类面具,但是栋栋对此却特别好奇,他想自己算出有多少类面具,于是他开始在人群中收集信息。 栋栋收集的信息都是戴第几号面具的人看到了第几号面具的编号。如戴第2号面具的人看到了第5 号面具的编号。栋栋自己也会看到一些编号,他也会根据自己的面具编号把信息补充进去。由于并不是每个人都能记住自己所看到的全部编号,因此,栋栋收集的信 息不能保证其完整性。现在请你计算,按照栋栋目前得到的信息,至多和至少有多少类面具。由于主办方已经声明了k≥3,所以你必须将这条信息也考虑进去。
    Input

    第一行包含两个整数n, m,用一个空格分隔,n 表示主办方总共准备了多少个面具,m 表示栋栋收集了多少条信息。接下来m 行,每行为两个用空格分开的整数a, b,表示戴第a 号面具的人看到了第b 号面具的编号。相同的数对a, b 在输入文件中可能出现多次。
    Output

    包含两个数,第一个数为最大可能的面具类数,第二个数为最小可能的面具类数。如果无法将所有的面具分为至少3 类,使得这些信息都满足,则认为栋栋收集的信息有错误,输出两个-1。
    Sample Input
    【输入样例一】

    6 5
    1 2
    2 3
    3 4
    4 1
    3 5

    【输入样例二】

    3 3
    1 2
    2 1
    2 3

    Sample Output
    【输出样例一】

    4 4

    【输出样例二】

    -1 -1
    【数据规模和约定】

    50%的数据,满足n ≤ 300, m ≤ 1000;
    100%的数据,满足n ≤ 100000, m ≤ 1000000。

    题解

    先把正向的边权设为1,反向为-1,然后分情况讨论

    1.没有环,那么就把我们找到的每一个联通块的最长链全部串起来是最大的,3为最小(如果最大和最小有冲突,就输出-1)

    2.有环,那我们就计算环的gcd,gcd为最大,3为最小(如果最大和最小有冲突,就输出-1)

     1 const
     2         maxn=100010;
     3         maxm=1000010;
     4 var
     5         id,first:array[0..maxn]of longint;
     6         last,next,w:array[0..2*maxm]of longint;
     7         flag:array[0..maxn]of boolean;
     8         n,m,tot,sum,t,max,min:longint;
     9  
    10 function gcd(a,b:longint):longint;
    11 begin
    12         if b=0 then exit(a);
    13         exit(gcd(b,a mod b));
    14 end;
    15  
    16 procedure insert(x,y,z:longint);
    17 begin
    18         inc(tot);
    19         last[tot]:=y;
    20         next[tot]:=first[x];
    21         first[x]:=tot;
    22         w[tot]:=z;
    23 end;
    24  
    25 procedure init;
    26 var
    27         i,x,y:longint;
    28 begin
    29         read(n,m);
    30         for i:=1 to m do
    31           begin
    32             read(x,y);
    33             insert(x,y,1);
    34             insert(y,x,-1);
    35           end;
    36 end;
    37  
    38 procedure dfs(x:longint);
    39 var
    40         i:longint;
    41 begin
    42         flag[x]:=true;
    43         i:=first[x];
    44         if id[x]>max then max:=id[x];
    45         if id[x]<min then min:=id[x];
    46         while i<>0 do
    47           begin
    48             if not flag[last[i]] then
    49               begin
    50                 id[last[i]]:=id[x]+w[i];
    51                 dfs(last[i]);
    52               end
    53             else t:=gcd(t,abs(id[x]+w[i]-id[last[i]]));
    54             i:=next[i];
    55           end;
    56 end;
    57  
    58 procedure work;
    59 var
    60         i:longint;
    61 begin
    62         for i:=1 to n do
    63           if not flag[i] then
    64           begin
    65             max:=0;
    66             min:=0;
    67             dfs(i);
    68             inc(sum,max-min+1);
    69           end;
    70         if t=0 then
    71           begin
    72             if sum<3 then write('-1 -1')
    73             else write(sum,' ',3);
    74           end
    75         else
    76           begin
    77             if t<3 then write('-1 -1')
    78             else
    79               begin
    80                 for i:=3 to t do
    81                   if t mod i=0 then break;
    82                 write(t,' ',i);
    83               end;
    84           end;
    85 end;
    86  
    87 begin
    88         init;
    89         work;
    90 end.
    View Code
  • 相关阅读:
    Vue项目中跨域问题解决
    子网掩码
    C++的const类成员函数
    在python3中使用urllib.request编写简单的网络爬虫
    Linux 重定向输出到多个文件中
    背包问题
    hdu-1272 小希的迷宫
    SQLAlchemy 几种查询方式总结
    pycharm快捷键、常用设置、配置管理
    python3判断字典、列表、元组为空以及字典是否存在某个key的方法
  • 原文地址:https://www.cnblogs.com/Randolph87/p/3679934.html
Copyright © 2020-2023  润新知