标签:
5 10 12 2 5 3 2 4 2 3 1 3 3 4 2 1 2 3 5 4 3 5 1 3 4 1 1 5 3 3 3 2 3 0 0 0
4
Problem : 4408 ( Minimum Spanning Tree ) Judge Status : Accepted RunId : 14484663 Language : C++ Author : lwj1994 Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector> #include<stdlib.h> using namespace std; struct s { int u,v,w; }edge[5010]; int cmp(const void *a,const void *b) { return (*(struct s *)a).w-(*(struct s *)b).w; } int n,m; long long mod; int pre[1010],f[1010],vis[1010]; long long G[1010][1010],C[1010][1010]; int find(int x,int *pre) { if(pre[x]==x) return x; return pre[x]=find(pre[x],pre); } vector<int>vt[1010]; void init() { int i; for(i=0;i<=n;i++) { f[i]=i; vis[i]=0; // vt[i].clear(); } for(i=0;i<=500;i++) vt[i].clear(); } long long det(long long a[][1010],int n) { int i,j,k; for(i=0;i<n;i++) { for(j=0;j<n;j++) { a[i][j]%=mod; } } long long ret=1; for(i=1;i<n;i++) { for(j=i+1;j<n;j++) { while(a[j][i]) { int t=a[i][i]/a[j][i]; for(k=i;k<n;k++) { a[i][k]=(a[i][k]-a[j][k]*t)%mod; } for(k=i;k<n;k++) { swap(a[i][k],a[j][k]); } ret=-ret; } } if(a[i][i]==0) { return 0; } ret=ret*a[i][i]%mod; } // if(ret<0) // ret=-ret; return (ret+mod)%mod; } int main() { while(scanf("%d%d%lld",&n,&m,&mod)!=EOF) { if(n==0&&m==0&&mod==0) break; int i,j,k; memset(G,0,sizeof(G)); memset(vis,0,sizeof(vis)); memset(C,0,sizeof(C)); memset(pre,0,sizeof(pre)); memset(f,0,sizeof(f)); for(i=0;i<m;i++) { scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); } if(m==0) { printf("0\n"); continue; } qsort(edge,m,sizeof(edge[0]),cmp); init(); int w=-1,a,b; long long ans=1; for(k=0;k<=m;k++) { if(edge[k].w!=w||k==m) { for(i=1;i<=n;i++) { if(vis[i]) { int u=find(i,pre); vt[u].push_back(i); vis[i]=0; } } for(i=1;i<=n;i++) { if(vt[i].size()>1) { int len=vt[i].size(); // memset(C,0,sizeof(C)); for(a=1;a<=n;a++) for(b=1;b<=n;b++) C[a][b]=0; for(a=0;a<len;a++) { for(b=a+1;b<len;b++) { int a1=vt[i][a]; int b1=vt[i][b]; C[b][a]-=G[a1][b1]; C[a][b]=C[b][a]; C[a][a]+=G[a1][b1]; C[b][b]+=G[a1][b1]; } } int ret=det(C,len); // printf("+++++%d\n",ret); ans=(ans*ret)%mod; for(a=0;a<len;a++) { f[vt[i][a]]=i; } } } for(i=1;i<=n;i++) { pre[i]=f[i]=find(i,f); vt[i].clear(); } if(k==m) break; w=edge[k].w; } int a=edge[k].u; int b=edge[k].v; int fa=find(a,f); int fb=find(b,f); if(fa!=fb) { int fx=find(fa,pre),fy=find(fb,pre); vis[fa]=vis[fb]=1; pre[fx]=fy; G[fa][fb]++; G[fb][fa]++; } } // printf("%d\n",ans); int flag=0; for(i=2;i<=n;i++) { if(flag) break; if(pre[i]!=pre[i-1]) flag=1; } if(!flag) printf("%lld\n",ans%mod); else printf("0\n"); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDOJ 题目4408 Minimum Spanning Tree(Kruskal+Matrix_Tree)
标签:
原文地址:http://blog.csdn.net/yu_ch_sh/article/details/47450889