标签:
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