zoukankan      html  css  js  c++  java
  • 洛谷 P1053 篝火晚会

    https://www.luogu.org/problemnew/show/P1053

    错误记录:判-1的时候出了些问题(比如只判了图是否连通);数组没清空

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<vector>
     5 using namespace std;
     6 #define fi first
     7 #define se second
     8 #define mp make_pair
     9 #define pb push_back
    10 typedef long long ll;
    11 typedef unsigned long long ull;
    12 typedef pair<int,int> pii;
    13 pii p[101000],an[101000];
    14 void upd(int x,int y)
    15 {
    16     if(an[y].fi&&an[y].se)
    17     {
    18         puts("-1");
    19         exit(0);
    20     }
    21     else if(an[y].fi)
    22     {
    23         an[y].se=x;
    24     }
    25     else
    26         an[y].fi=x;
    27 }
    28 int tm;
    29 int d[101000];
    30 bool vis[101000];
    31 void dfs1(int u)
    32 {
    33     vis[u]=1;d[u]=++tm;
    34     if(!vis[an[u].fi])    dfs1(an[u].fi);
    35     if(!vis[an[u].se])    dfs1(an[u].se);
    36 }
    37 void dfs2(int u)
    38 {
    39     vis[u]=1;d[u]=++tm;
    40     if(!vis[an[u].se])    dfs2(an[u].se);
    41     if(!vis[an[u].fi])    dfs2(an[u].fi);
    42 }
    43 bool exi(int i,int j)
    44 {
    45     return p[i].fi==j||p[i].se==j;
    46 }
    47 int n,an1[101000],an2[101000];
    48 int ans;
    49 int main()
    50 {
    51     int i;
    52     scanf("%d",&n);
    53     for(i=1;i<=n;i++)
    54     {
    55         scanf("%d%d",&p[i].fi,&p[i].se);
    56         upd(i,p[i].fi);upd(i,p[i].se);
    57     }
    58     for(i=1;i<=n;i++)
    59         if(!exi(p[i].fi,i)||!exi(p[i].se,i))
    60         {
    61             puts("-1");
    62             return 0;
    63         }
    64     dfs1(1);
    65     /*
    66     if(tm!=n)
    67     {
    68         puts("-1");
    69         return 0;
    70     }
    71     */
    72     for(i=1;i<=n;i++)
    73         an1[(d[i]-i+n)%n]++;
    74     for(i=0;i<n;i++)
    75         ans=max(ans,an1[i]);
    76     tm=0;
    77     memset(vis,0,sizeof(vis));
    78     dfs2(1);
    79     for(i=1;i<=n;i++)
    80         an2[(d[i]-i+n)%n]++;
    81     for(i=0;i<n;i++)
    82         ans=max(ans,an2[i]);
    83     printf("%d",n-ans);
    84     return 0;
    85 }
    View Code
  • 相关阅读:
    关于p标签
    用unescape反编码得出汉字
    一个未知高度垂直居中的简单方法
    发现个div float的小秘密
    w3cschool关于list-style-position时的另外发现
    oracle 11gR2默认密码修改
    程序员的十楼层。看看自己在第几层
    Steve Yegge:Google面试秘籍
    为学Linux,我看了这些书
    程序员的困境
  • 原文地址:https://www.cnblogs.com/hehe54321/p/9776078.html
Copyright © 2011-2022 走看看