BZOJ3092 : [FDU2012校賽] A Famous King’s Trip

Claris發表於2016-08-25

題目等價於去掉兩條邊,使得剩下的圖連通,且所有點度數都為偶數。

首先特判掉圖一開始就不連通的情況。

求出dfs生成樹,對於每條非樹邊隨機一個權值,每條樹邊的權值為所有經過它的非樹邊權值的異或和。

那麼剩下的圖連通等價於兩條邊權值非$0$,且兩條邊的權值不等。

如果有$2$個奇點,那麼兩條邊有公共點,列舉公共點判斷即可。

否則只能是$4$個奇點,分類討論判斷所有連邊方式即可。

時間複雜度$O(n+m)$。

 

#include<cstdio>
#define N 200010
int Case,n,m,i,x,y,g[N],v[N<<1],nxt[N<<1],ed,d[N],vis[N],dfn,f[N],q[N],cnt,ansx,ansy;
unsigned long long seed,h[N],tag[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y){d[x]^=1;v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void dfs(int x,int y){
  vis[x]=++dfn;
  for(int i=g[x];i;i=nxt[i]){
    int u=v[i];
    if(u==y)continue;
    if(!vis[u])f[u]=i>>1,dfs(u,x);
    else if(vis[u]<vis[x]){
      h[i>>1]=seed=seed*233+17;
      tag[x]^=seed,tag[u]^=seed;
    }
  }
}
void dfs2(int x,int y){
  vis[x]=++dfn;
  for(int i=g[x];i;i=nxt[i]){
    int u=v[i];
    if(u==y)continue;
    if(!vis[u])dfs2(u,x),tag[x]^=tag[u];
  }
  if(x>1)h[f[x]]^=tag[x];
}
inline int get(int x,int y){
  for(int i=g[x];i;i=nxt[i])if(v[i]==y)return i>>1;
  return 0;
}
inline void up(int x,int y){
  if(!x||!y)return;
  if(!h[x]||!h[y]||h[x]==h[y])return;
  if(x>y){int z=x;x=y;y=z;}
  if(x<ansx)ansx=x,ansy=y;else if(x==ansx&&y<ansy)ansy=y;
}
bool solve(){
  dfn=cnt=seed=0;
  for(i=1;i<=n;i++)g[i]=d[i]=vis[i]=f[i]=tag[i]=0;
  for(i=1;i<=m;i++)h[i]=0;
  for(ed=i=1;i<=m;i++)read(x),read(y),add(x,y),add(y,x);
  for(i=1;i<=n;i++)if(d[i])q[++cnt]=i;
  if(cnt!=2&&cnt!=4)return 0;
  dfs(1,0);
  for(i=1;i<=n;i++)if(!vis[i])return 0;
  for(dfn=0,i=1;i<=n;i++)vis[i]=0;
  dfs2(1,0);
  ansx=N;
  if(cnt==4){
    up(get(q[1],q[2]),get(q[3],q[4]));
    up(get(q[1],q[3]),get(q[2],q[4]));
    up(get(q[1],q[4]),get(q[2],q[3]));
  }else for(i=1;i<=n;i++)if(!d[i])up(get(i,q[1]),get(i,q[2]));
  if(ansx<N)return printf("YES\n%d %d\n",ansx,ansy),1;
  return 0;
}
int main(){
  while(~scanf("%d%d",&n,&m)){
    printf("Case %d: ",++Case);
    if(!solve())puts("NO");
  }
  return 0;
}

  

相關文章