最小生成树计数

#include<bits/stdc++.h>
using namespace std;
const int mod=31011;
const int N=100+10;
const double eps=1e-8;
typedef long long ll;
int n,m;
int fa[N];
struct node{
    int x,y;
    int val;
}bian[1000+20];
bool cmp(node a,node b){
    return a.val<b.val;
}
int fin(int x){
    if(fa[x]==x) return x;
    return fa[x]=fin(fa[x]);
}
void mer(int x,int y){
    int k1=fin(x);
    int k2=fin(y);
    if(k1!=k2){
        fa[k1]=k2;
    }
}
struct tr{
    double f[N][N];
    int cnt;
    void init(){
        memset(f,0,sizeof f);cnt=0;
    }
    tr operator -(const tr &b){
        tr c;c.init();c.cnt=cnt;
        for(int i=1;i<=cnt;i++)
         for(int j=1;j<=cnt;j++) 
          c.f[i][j]=f[i][j]-b.f[i][j];
        return c;
    }
    void op(){
        for(int i=1;i<=cnt;i++){
            for(int j=1;j<=cnt;j++)
             cout<<f[i][j]<<" ";
            cout<<endl;
        }    
    }
};
ll guass(tr S){
    int s=S.cnt;
    double a[N][N];
    memcpy(a,S.f,sizeof S.f);
    int sign=0;
    for(int i=1;i<=s;i++){
        int id=i;
        for(int j=i+1;j<=s;j++){
            if(fabs(a[j][i])>fabs(a[id][i])) id=j;
        }
        if()
    }
}
int mem[N],mems;
int edge[N],tot;
int du[N];
int li(int x){
    int k=lower_bound(mem+1,mem+mems+1,x)-mem;
    return k;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&bian[i].x,&bian[i].y,&bian[i].val);
    }    
    sort(bian+1,bian+m+1,cmp);
    for(int i=1;i<=m;i++){
        memset(mem,0,sizeof mem);mems=0;
        memset(edge,0,sizeof edge);tot=0;
        int nc=bian[i].val;
        int st=i,ed;
        while(bian[i].val==nc){
            int k1=fin(bian[i].x);
            int k2=fin(bian[i].y);
            if(k1!=k2){
            edge[++tot]=i;
            mem[++mems]=k1;
            mem[++mems]=k2;
            }
            i++;
        }
        i--;
        mems=unique(mem+1,mem+mems+1)-mem-1;
        tr D,B;D.init();B.init();
        D.cnt=B.cnt=mems;
        for(int j=1;j<=tot;j++){
            int x=li(fin(bian[j].x));
            int y=li(fin(bian[j].y));
            D.a[x][x]+=1.0,D.a[y][y]+=1.0;
            B.a[x][y]+=1.0,B.a[y][x]+=1.0;
        }
        tr A=D-B;
        A.cnt--;
        gauss(A);
    }
}

猜你喜欢

转载自www.cnblogs.com/Miracevin/p/9269646.html