最大生成树,注意边数组开二倍大小。注意不连通输出-1;
#include < iostream >
#include < cstdio >
#include < cstdlib >
#include < cstring >
#include < queue >
using namespace std;
#define maxn 1005
#define maxm 20005
struct Edge
{
int v, next, w;
Edge( int vv, int nn, int ww) :
v(vv), next(nn), w(ww)
{
}
Edge()
{
}
} edge[maxm * 2 ];
int head[maxn], count;
bool vis[maxn];
int ans = 0 ;
int m, n;
bool operator < ( const Edge & a, const Edge & b)
{
return a.w < b.w;
}
void addedge( int u, int v, int w)
{
edge[count].next = head[u];
edge[count].v = v;
edge[count].w = w;
head[u] = count;
count ++ ;
}
void input()
{
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 -- ;
addedge(a, b, c);
addedge(b, a, c);
}
}
void prim( int src)
{
priority_queue < Edge > pq;
int pre = 0 ;
Edge temp;
pq.push(Edge(src, 0 , 0 ));
while ( ! pq.empty())
{
do
{
temp = pq.top();
pq.pop();
} while ( ! pq.empty() && vis[temp.v]);
if (vis[temp.v])
return ;
vis[temp.v] = true ;
pre = temp.v;
ans += temp.w;
for ( int i = head[pre]; i != - 1 ; i = edge[i].next)
if ( ! vis[edge[i].v])
pq.push(edge[i]);
}
}
int main()
{
// freopen("t.txt", "r", stdin);
memset(head, - 1 , sizeof (head));
memset(vis, 0 , sizeof (vis));
count = 0 ;
input();
prim( 0 );
bool ok = true ;
for ( int i = 0 ; i < n; i ++ )
if ( ! vis[i])
{
ok = false ;
break ;
}
if (ok)
printf( " %d\n " , ans);
else
printf( " %d\n " , - 1 );
return 0 ;
}