https://www.luogu.org/problemnew/show/P1053
错误记录:判-1的时候出了些问题(比如只判了图是否连通);数组没清空
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }