zoukankan      html  css  js  c++  java
  • Atcoder Grand 011 C

    题意:

    给出一个n个点的图,现在构造一个有n^2个点的新图,新图每个点表示为(a,b)(a,b<=n),两个点$(a,b),(c,d)$之间有边当且仅当原图中ac之间有边,bd之间有边。

    问新图中有几个联通块。

     

    第一眼看上去似乎很不可做,想一想新图中两个点$(a,b),(c,d)$在同一个联通块其实就是原图中放着两个棋子,一个在a,一个在b,两个棋子同时走相同步后第一个棋子在c,第二个在d。

    先考虑两个棋子在原图同一个联通块里的情况,如果这个联通块有奇环,那么这个联通块里所有点对在新图中是一个联通块,否则是两个,大概就是同时从黑白点走或者从一黑一白走。

    如果两个棋子在原图中不同联通块里,那么如果两个联通块中都没有奇环,那么形成两个联通块,否则形成一个。

    需要特判原图中联通块大小为1的情况。

     

    #include<bits/stdc++.h>
    #define N 400005
    #define ll long long
    using namespace std;
    int n,m;
    int head[N],ver[N],nxt[N],tot;
    void add(int a,int b)
    {
        tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;return ;
    }
    int v[N];
    int cnt,flag,sz,szz,tp;
    void dfs(int x,int c)
    {
        cnt++;v[x]=c;
        for(int i=head[x];i;i=nxt[i])
        {
            if(v[ver[i]]==-1)dfs(ver[i],c^1);
            else if(v[ver[i]]!=(c^1))flag=1;
        }
        return ;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int t1,t2;
            scanf("%d%d",&t1,&t2);
            add(t1,t2);add(t2,t1);
        }
        ll ans=0;memset(v,-1,sizeof(v));
        for(int i=1;i<=n;i++)
        {
             cnt=0;flag=0;
             if(v[i]==-1)dfs(i,0);
             if(cnt)
             {
                 if(flag||cnt==1)ans++;
                 else ans+=2;
                 if(cnt==1)tp++;
                 else
                 {
                     if(!flag)szz++;
                     sz++;
                 }
             }
        }
        ans+=1LL*2*tp*(n-1);
        ans-=1LL*tp*(tp-1);
        ans+=1LL*sz*(sz-1);
        ans+=1LL*szz*(szz-1);
        cout<<ans<<endl;
        return 0;
    }
    

      

  • 相关阅读:
    Python Semaphore
    Python 互斥锁
    Python 递归锁
    Python GIL锁
    Python 线程调用
    进程与线程
    Python paramiko模块
    Python SocketServer模块
    MonoDevelop with Visual Studio to Linux and Mac OSX maintaining a single code base for all platforms.
    mime大全收集
  • 原文地址:https://www.cnblogs.com/ezyzy/p/7681660.html
Copyright © 2011-2022 走看看