zoukankan      html  css  js  c++  java
  • BZOJ2278 : [Poi2011]Garbage

    如果两个环相交,那么相交的部分相当于没走。

    因此一定存在一种方案,使得里面的环都不相交。

    把不需要改变状态的边都去掉,剩下的图若存在奇点则无解。

    否则,每找到一个环就将环上的边都删掉,时间复杂度$O(n+m)$。

    #include<cstdio>
    const int N=2000010,BUF=20000000;
    int n,_m,m,i,j,k,x,y,d[N],s[N],e[N][3],a[N],v[N],q[N],t;
    int cnt,now,tmp[N],ans[N],pos;
    char Buf[BUF],*buf=Buf;
    inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
    void write(int x){if(x>9)write(x/10);putchar(x%10+48);}
    int main(){
      for(fread(Buf,1,BUF,stdin),read(n),read(_m);_m--;){
        read(i),read(j),read(x),read(y);
        if(x^y)d[e[++m][0]=i]++,d[e[m][1]=j]++;
      }
      for(i=1;i<=n;i++)if(d[i]&1)return puts("NIE"),0;
      for(i=1;i<=n;i++)s[i+1]=s[i]+d[i],d[i]=0;
      for(i=1;i<=m;a[s[x]+d[x]]=a[s[y]+d[y]]=i++)d[x=e[i][0]]++,d[y=e[i][1]]++;
      for(i=1;i<=n;i++)for(q[t=1]=x=i;x;x=y){
        for(v[x]=1,y=0;d[x];d[x]--)if(!e[j=a[s[x]+d[x]]][2]){
          e[j][2]=1;
          if(v[k=e[j][x==e[j][0]]]){
            for(cnt++,now=0,y=k;q[t]!=k;v[q[t--]]=0)tmp[++now]=q[t];
            for(tmp[++now]=k,ans[++pos]=now,k=1;k<=now;k++)ans[++pos]=tmp[k];
            ans[++pos]=tmp[1];
          }else y=q[++t]=k;
          break;
        }
        if(!y&&t)y=q[t--];
      }
      for(write(cnt),putchar(10),i=1;i<=pos;i=j+1){
        write(ans[i]),putchar(32);
        for(j=i+1;j<=i+ans[i];j++)write(ans[j]),putchar(32);
        write(ans[j]),putchar(10);
      }
      return 0;
    }
    

      

  • 相关阅读:
    第一章:帝国的余晖 AT&T公司
    个人最终总结——2(完成了第3个问题)
    个人最终总结——1(完成了前面2个问题)
    week9:个人博客作业
    week8:个人博客作业
    week7:个人博客作业
    week6:个人博客作业
    将博客搬至CSDN
    top命令
    java并发编程的艺术-第四章笔记
  • 原文地址:https://www.cnblogs.com/clrs97/p/4705301.html
Copyright © 2011-2022 走看看