1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include<bits/stdc++.h> using namespace std; const int maxn=1e3; const int maxm=2e5; struct Edge{int u,v,nxt;}; int n,m; int hd[maxn+5],et; Edge e[maxm+5]; int tot; int dis[maxn+5]; int col[maxn+5]; int res[maxn+5]; queue<int> qu; int ans; inline void Adde(int u,int v){ e[et].u=u,e[et].v=v,e[et].nxt=hd[u],hd[u]=et++; } void Bfs(int u){ int v,tmp=0; memset(dis,-1,sizeof(dis)); while(qu.size()) qu.pop(); qu.push(u); dis[u]=0; while(qu.size()){ u=qu.front(); qu.pop(); tmp=max(tmp,dis[u]); for(int i=hd[u];~i;i=e[i].nxt){ v=e[i].v; if(~dis[v]) continue; dis[v]=dis[u]+1; if(~col[v]){ if(col[v]==col[u]){ puts("-1"); exit(0); } } else col[v]=col[u]^1; qu.push(v); } } res[col[u]>>1]=max(res[col[u]>>1],tmp); } signed main(){ int u,v; memset(hd,-1,sizeof(hd)); memset(col,-1,sizeof(col)); scanf("%d%d",&n,&m); while(m--){ scanf("%d%d",&u,&v); Adde(u,v),Adde(v,u); } for(int i=1;i<=n;i++){ if(!(~col[i])) col[i]=tot,tot+=2; Bfs(i); } for(int i=0;i<=(tot>>1);i++) ans+=res[i]; printf("%d",ans); return 0; }
|