#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
今日推荐
周排行