洛谷 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
原文地址:https://www.cnblogs.com/hehe54321/p/9776078.html