[二分图 图的直径] Codeforces 542E VK Cup 2015 - Round 3 E.Playing on Graph

来源:互联网 发布:linux脚本启动程序 编辑:程序博客网 时间:2024/06/05 22:33
存在奇环就一定无解。
对于一个二分图,最长链为这个图的直径。

将所有连通块的直径相加


#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>using namespace std;inline char nc(){  static char buf[100000],*p1=buf,*p2=buf;  if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }  return *p1++;}inline void read(int &x){  char c=nc(),b=1;  for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;  for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}const int N=1003;const int M=100005;struct edge{  int u,v,next;}G[M<<1];int head[N],inum;inline void add(int u,int v,int p){  G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p;}int clr[N],dis[N];int belong[N],cnt;#define V G[p].vint tag=0;inline void dfs(int u){  belong[u]=cnt;  for (int p=head[u];p;p=G[p].next)    if (!belong[V])      clr[V]=clr[u]^1,dfs(V);    else if (clr[V]==clr[u])tag=1;}int n,m;int Q[N],l,r;inline void bfs(int S){  memset(dis,-1,sizeof(dis));  l=r=-1; dis[S]=0;  Q[++r]=S;  while (l<r){    int u=Q[++l];    for (int p=head[u];p;p=G[p].next)      if (dis[V]==-1)dis[V]=dis[u]+1,Q[++r]=V;  }}int ans[N];int main(){  int iu,iv;  freopen("t.in","r",stdin);  freopen("t.out","w",stdout);  read(n); read(m);  for (int i=1;i<=m;i++)    read(iu),read(iv),add(iu,iv,++inum),add(iv,iu,++inum);  for (int i=1;i<=n;i++)    if (!belong[i])      ++cnt,dfs(i);  if (tag) return printf("-1\n"),0;  for (int i=1;i<=n;i++){    bfs(i);    for (int j=1;j<=n;j++)      ans[belong[i]]=max(ans[belong[i]],dis[j]);  }  int Ans=0;  for (int i=1;i<=cnt;i++)    Ans+=ans[i];  printf("%d\n",Ans);}




0 0