Simple: And check the set
#include <vector>#include<iostream>#include<queue>#include<cmath>#include<map>#include<cstring>#include<algorithm>#include<cstdio>using namespaceStd;typedefLong LongLL;Const intn=2e5+5;ConstLL mod=1e9+7;intFa[n];intFindintx) { returnx==fa[x]?x:fa[x]=find (Fa[x]);}intMain () {intn,m; scanf ("%d%d",&n,&m); for(intI=1; i<=n;++i) fa[i]=i; while(m--){ intu,v; scanf ("%d%d",&u,&v); U=find (u), v=Find (v); if(u!=v) Fa[u]=v,--N; Else{printf ("no\n");return 0;} } if(n==1) printf ("yes\n"); Elseprintf"no\n"); return 0;}
View Code
Medium: The Longest road
#include <vector>#include<iostream>#include<queue>#include<cmath>#include<map>#include<cstring>#include<algorithm>#include<cstdio>using namespaceStd;typedefLong LongLL;Const intn=2e5+5;ConstLL mod=1e9+7;intHead[n],tot,n,m,d[n>>1],ret;structedge{intV,next;} Edge[n];voidAddintUintv) {EDGE[TOT].V=v; Edge[tot].next=Head[u]; Head[u]=tot++;}voidBFsintu) {memset (d,-1,sizeof(d)); Queue<int>q;q.push (U); D[u]=0; while(!Q.empty ()) { intx=Q.front (); Q.pop (); for(intI=head[x];~i;i=Edge[i].next) { intv=edge[i].v; if(d[v]!=-1)Continue; D[V]=d[x]+1; Q.push (v); if(D[v]>d[ret]) ret=W; } }}intMain () {scanf ("%d%d",&n,&m); memset (Head,-1,sizeof(head)); tot=0; for(intI=1; i<n;++i) { intu,v; scanf ("%d%d",&u,&v); Add (u,v); add (V,u); } ret=1; BFS (1); BFS (ret); printf ("%d\n", D[ret]); return 0;}
View Code
Hard: Dynamic longest, LCA maintenance
#include <vector>#include<iostream>#include<queue>#include<cmath>#include<map>#include<cstring>#include<algorithm>#include<cstdio>using namespaceStd;typedefLong LongLL;Const intn=2e5+5;ConstLL mod=1e9+7;intHead[n],tot,n,d[n];structedge{intV,next;} Edge[n];voidAddintUintv) {EDGE[TOT].V=v; Edge[tot].next=Head[u]; Head[u]=tot++;}intfa[n][ -];voidDfsintUintf) {fa[u][0]=f;d[u]=d[f]+1; for(intI=head[u];~i;i=edge[i].next) DFS (edge[i].v,u);}intLCA (intUintv) { if(d[u]<D[v]) swap (U,V); for(intT=d[u]-d[v],i=0; t;t>>=1,++i)if(t&1) u=Fa[u][i]; if(U==V)returnu; for(intI= +; i>=0;--i) { if(fa[u][i]!=-1&&fa[u][i]!=fa[v][i]) u=fa[u][i],v=Fa[v][i]; } returnfa[u][0];}intMain () {scanf ("%d",&N); memset (Head,-1,sizeof(head)); for(intI=2; i<=n;++i) { intU;SCANF ("%d",&u); add (u,i); } memset (FA,-1,sizeof(FA)); DFS (1,0); fa[1][0]=-1; for(intj=1;(1<<J) <=n;++j) for(intI=1; i<=n;++i)if(fa[i][j-1]!=-1) Fa[i][j]=fa[fa[i][j-1]][j-1]; printf ("1"); intx=1, y=2, z=1; for(intI=3; i<=n;++i) { intTpx=lca (x,i), lenx=d[x]+d[i]-2*D[TPX]; intTpy=lca (y,i), leny=d[y]+d[i]-2*D[tpy]; if(lenx>=leny&&lenx>=z) {y=i;z=Lenx; } Else if(leny>=lenx&&leny>=z) {x=i;z=Leny; } printf ("%d", z); } printf ("\ n"); return 0;}
View Code
Codeforces 690c3 Brain Network