• BZOJ3659 : Which Dreamed It


    首先判断一下是否无解,并剔除孤立点。

    根据best theorem,有向图中以$i$为起点的欧拉回路个数为:

    以$i$为根的树形图个数$ imesprod_{i=1}^n (deg(i)-1)!$。

    根据matrix tree theorem,以$i$为根的树形图个数$=$基尔霍夫矩阵去掉第$i$行第$i$列的行列式。

    $ans=以1为起点的欧拉回路个数 imes 1的度数$。

    高斯消元即可,时间复杂度$O(n^3log P)$。

    #include<cstdio>
    typedef long long ll;
    const int N=110,M=200010,P=1000003;
    int n,m,i,j,k,x,y,in[N],ou[N],vis[N],g[N][N];ll f[M],a[N][N],ans;
    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';}
    void dfs(int x){
      vis[x]=++m;
      for(int i=1;i<=n;i++)if(g[x][i]&&!vis[i])dfs(i);
    }
    inline void swap(ll&a,ll&b){ll c=a;a=b;b=c;}
    ll det(int n){
      ll ans=1;bool flag=1;
      for(i=1;i<=n;i++)for(j=1;j<=n;j++)a[i][j]=(a[i][j]%P+P)%P;
      for(i=1;i<=n;i++){
        for(j=i+1;j<=n;j++)while(a[j][i]){
          ll t=a[i][i]/a[j][i];
          for(k=i;k<=n;k++)a[i][k]=(a[i][k]+P-t*a[j][k]%P)%P;
          for(k=i;k<=n;k++)swap(a[i][k],a[j][k]);
          flag^=1;
        }
        ans=ans*a[i][i]%P;
        if(!ans)return 0;
      }
      if(!flag)ans=P-ans;
      return ans;
    }
    int solve(){
      for(m=0,i=1;i<=n;i++)in[i]=ou[i]=vis[i]=0;
      for(i=0;i<=n;i++)for(j=0;j<=n;j++)a[i][j]=g[i][j]=0;
      int ed=0;
      for(i=1;i<=n;i++)for(read(k);k--;g[i][j]++)read(j),ed++;
      for(dfs(i=1);i<=n;i++)if(!vis[i]&&g[i])return 0;
      for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(g[i][j]){
        x=vis[i],y=vis[j];
        ou[x]+=g[i][j];in[y]+=g[i][j];
        a[x-1][y-1]-=g[i][j],a[x-1][x-1]+=g[i][j];
      }
      for(i=1;i<=m;i++)if(in[i]!=ou[i])return 0;
      if(m==1)return f[g[1][1]];
      ans=det(m-1)*in[1];
      for(i=1;i<=m;i++)ans=ans*f[in[i]-1]%P;
      return ans;
    }
    int main(){
      for(f[0]=i=1;i<M;i++)f[i]=f[i-1]*i%P;
      while(1){
        read(n);
        if(!n)return 0;
        printf("%d
    ",solve());
      }
    }
    

      

  • 相关阅读:
    个人理解的块状格式化上下文
    行框与浮动与清除浮动
    关于offset,scroll,position
    C++常用字符串操作和UTF-8和GBK之间的转换以及判定(转)
    MFC使用LoadBitmap方法加载位图文件失败解决方案(转)
    MFC在子线程中创建窗口(PostMessage方法)
    MFC线程间消息传递(转)
    MFC对话框常用操作文章收藏
    C++ 跨dll传递string类型参数执行出错问题
    C++ windows API函数末尾A和W的意义(转)
  • 原文地址:https://www.cnblogs.com/clrs97/p/5348718.html
Copyright © 2020-2023  润新知