1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include<iostream> #include<cstdio> #include<cstring> #include<string> #define INF 1<<30 #define maxn 1010 using namespace std; int G[maxn+1][maxn+1]; int intree[maxn]; int minweight[maxn]; int sumweight; int flag=0; void chushihua() { memset(intree,0,sizeof(intree)); memset(minweight,0,sizeof(minweight)); flag=0; for(int i=0;i<maxn;i++) { for(int j=0;j<=maxn;j++) { G[i][j]=INF; } } sumweight=0; } void prime(int n) { int node,Minweight; for(int i=1;i<=n;i++) minweight[i]=G[1][i]; intree[1]=1; for(int i=2;i<=n;i++) { Minweight=INF; for(int j=1;j<=n;j++) { if(minweight[j]<Minweight&&!intree[j]) { Minweight=minweight[j]; node=j; } } intree[node]=1; sumweight+=Minweight; for(int j=1;j<=n;j++) { if(!intree[j]&&minweight[j]>G[node][j]) { minweight[j]=G[node][j]; } } } } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int a1,a2,v; chushihua(); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a1,&a2,&v); G[a1][a2]=-v; G[a2][a1]=-v; } prime(n); for(int i=1;i<=n;i++) { if(intree[i]==0) {flag=1; break;} } if(flag) printf("-1\n"); else printf("%d\n",-sumweight); } return 0; }
|