zoukankan      html  css  js  c++  java
  • BZOJ1016 [JSOI2008]最小生成树计数[最小生成树+搜索]

    于是,由Kruskal衍生性质(见本人MST学习笔记),可以单独处理每次相同的一堆边,因为保证了相同权值边不超过$10$条,所以直接爆搜即可。$O(可过)$。

    细节:其实如果把并查集写成按秩合并,可以直接搜每条边选不选,选就继续搜下一条边,直到加入的边等于MST中该权值边数且无环,回退的时候撤回就行。

    但是,我傻逼写了个路径压缩。。于是自己实现的极其繁琐,还WA了好多发,以下code仅供参考请勿模仿。

    WA1:tmpu/v大小不够。。空间。。老问题。。

    WA2:不连通的情况。。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #define dbg(x) cerr << #x << " = " << x <<endl
     8 #define dbg2(x,y) cerr<< #x <<" = "<< x <<"  "<< #y <<" = "<< y <<endl
     9 using namespace std;
    10 typedef long long ll;
    11 typedef double db;
    12 typedef pair<int,int> pii;
    13 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
    14 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
    15 template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,1):0;}
    16 template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,1):0;}
    17 template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
    18 template<typename T>inline T read(T&x){
    19     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c=='-')f=1;
    20     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
    21 }
    22 const int N=100+7,M=1000+7,P=31011;
    23 struct thxorz{
    24     int u,v,w;
    25     inline bool operator <(const thxorz&A)const{return w<A.w;}
    26 }e[M];
    27 int anc[N],chk[N];
    28 inline int Find(int x){return anc[x]==x?x:anc[x]=Find(anc[x]);}
    29 inline int _Find(int x){return chk[x]==x?x:chk[x]=_Find(chk[x]);}
    30 int bin[15],cnt,tmpu[M],tmpv[M];
    31 int n,m,ans=1;
    32 int den_tou_gei_nou(int s,int t,int rest){//dbg2(s,rest);
    33     if(t-s+1<rest)return 0;
    34     if(!rest){
    35         for(register int i=1;i<=cnt;++i)
    36             if(_Find(tmpu[bin[i]])^_Find(tmpv[bin[i]]))chk[chk[tmpu[bin[i]]]]=chk[tmpv[bin[i]]];
    37             else{
    38                 for(register int j=1;j<=cnt;++j)chk[tmpu[bin[j]]]=tmpu[bin[j]],chk[tmpv[bin[j]]]=tmpv[bin[j]];//dbg("shippai");
    39                 return 0;
    40             }
    41         for(register int j=1;j<=cnt;++j)chk[tmpu[bin[j]]]=tmpu[bin[j]],chk[tmpv[bin[j]]]=tmpv[bin[j]];//dbg("seikou");
    42         return 1;
    43     }
    44     int ret=den_tou_gei_nou(s+1,t,rest);
    45     bin[++cnt]=s,ret+=den_tou_gei_nou(s+1,t,rest-1),--cnt;
    46     return ret>=P?ret-P:ret;
    47 }
    48 struct stothx{int nxt,to;}G[M<<1];
    49 int Head[N],tot;
    50 inline void Addedge(int x,int y){
    51     G[++tot].to=y,G[tot].nxt=Head[x],Head[x]=tot;
    52     G[++tot].to=x,G[tot].nxt=Head[y],Head[y]=tot;
    53 }
    54 int vis[N];
    55 void dfs(int x){
    56     vis[x]=1;
    57     for(register int j=Head[x];j;j=G[j].nxt)if(!vis[G[j].to])dfs(G[j].to);
    58 }
    59 
    60 int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
    61     read(n),read(m);
    62     for(register int i=1;i<=m;++i)read(e[i].u),read(e[i].v),read(e[i].w),Addedge(e[i].u,e[i].v);
    63     dfs(1);
    64     for(register int i=1;i<=n;++i)if(!vis[i]){puts("0");return 0;}
    65     sort(e+1,e+m+1);for(register int i=1;i<=n;++i)anc[i]=i,chk[i]=i;
    66     for(register int i=1,st=1,edge=0;i<=m;++i,edge=0)if(e[i].w^e[i+1].w){
    67         for(register int j=st;j<=i;++j)tmpu[j]=Find(e[j].u),tmpv[j]=Find(e[j].v);//dbg2(tmpu[j],tmpv[j]),dbg2(j,edge);
    68         for(register int j=st;j<=i;++j)if(Find(e[j].u)^Find(e[j].v))++edge,anc[anc[e[j].u]]=anc[e[j].v];
    69         if(edge)cnt=0,ans=ans*den_tou_gei_nou(st,i,edge)%P;//dbg2(ans,edge);
    70         st=i+1;
    71     }
    72     return printf("%d",ans),0;
    73 }
    View Code

    事实上,当忽略同权值边数量限制时候,可以直接用matrix-tree定理。鉴于CSP肯定不会考(希望不打脸),所以如果没退役的话之后是会学习一下的。

  • 相关阅读:
    14个以春天为主题的网页设计
    使用 CSS3 创建下拉菜单
    视觉灵感:30个漂亮的的网站设计
    Null Object设计模式
    js插件库之图像幻灯片和画廊
    C#读取HTML文件内容写入记事本
    最好的图片水印实现思路
    抽奖系统
    对过万条数据的数据库字段内容批量替换程序
    通用 图片/文字 水印函数
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/11695154.html
Copyright © 2011-2022 走看看