标签:
#include<stdio.h> #include<string.h> #include<stdlib.h> #define INF 0xfffffff int n,m,k; int pre[10005]; struct s { int u,v,w; }edge[1000005]; int cmp(const void *a,const void *b) { return (*(struct s *)a).w-(*(struct s *)b).w; } int find(int x) { if(x==pre[x]) return x; return pre[x]=find(pre[x]); } void init(int n) { int i; for(i=0;i<=n;i++) { pre[i]=i; } } int ku(int k) { int sum=0,i; for(i=0;i<k;i++) { int u=edge[i].u; int v=edge[i].v; int w=edge[i].w; int fa=find(u); int fb=find(v); if(fa!=fb||w<0) { sum+=w; pre[fa]=fb; } } return sum; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { int i,j; init(n); for(i=0;i<m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); edge[i].u=u; edge[i].v=v; edge[i].w=w; } k=m; for(i=1;i<=n;i++) { int cost; scanf("%d",&cost); if(cost!=-1) { edge[k].u=0; edge[k].v=i; edge[k++].w=cost; } } for(i=0;i<m;i++) { int fa=find(edge[i].u); int fb=find(edge[i].v); if(fa!=fb) pre[fa]=fb; } for(i=2;i<=n;i++) { if(find(1)!=find(i)) { break; } } int temp; if(i==n+1) { init(n); qsort(edge,m,sizeof(edge[0]),cmp); temp=ku(m); init(n); qsort(edge,k,sizeof(edge[0]),cmp); int ans=ku(k); if(ans>temp) printf("%d\n",temp); else printf("%d\n",ans); continue; } init(n); qsort(edge,k,sizeof(edge[0]),cmp); int ans=ku(k); printf("%d\n",ans); } }
标签:
原文地址:http://blog.csdn.net/yu_ch_sh/article/details/44396327