简单的最大树,prim或者kruskal都可以,贪心思想
注意一下输入会有重边,另外图不连通输出-1
贴下代码,可以用堆优化一下,不过既然过了就算了...
#include<cstdio>
#include<cstring>
/*:)输入居然有重边。。。我也是醉了*/
const int maxn=1005;
int len[maxn][maxn];
int n,m;
int dist[maxn],visited[maxn];
int solve(int s){
memset(dist,-1,sizeof(dist));
memset(visited,0,sizeof(visited));
dist[s]=0;
int cnt=0,ans=0;
while(true){
int max=-1,maxI=-1;
for(int i=0;i<n;i++){
if(!visited[i]&&dist[i]>max){
max=dist[i];
maxI=i;
}
}
if(maxI==-1) break;
visited[maxI]=1;
cnt++;
ans+=dist[maxI];
for(int i=0;i<n;i++){
if(!visited[i]&&len[i][maxI]){
if(len[i][maxI]>dist[i]) dist[i]=len[i][maxI];
}
}
}
if(cnt<n) return -1;
return ans;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
a--;b--;
if(!len[a][b]) len[a][b]=len[b][a]=c;
else{
if(len[a][b]<c) len[a][b]=len[b][a]=c;
}
}
int ans=solve(0);
printf("%d\n", ans);
return 0;
}