#include<bits/stdc++.h>
using namespace std;

const int N = 510;
int g[N][N];
int dist[N], st[N], pre[N];
int n, m;
void prim()
{
    memset(dist, 0x3f, sizeof dist);
    int res = 0;
    dist[1] = 0;
    for(int i = 0; i < n; i++)
    {
        int x = -1;
        for(int j = 1; j <= n; j++)
        {
            if(!st[j] && (x == -1 || dist[j] < dist[x]))
                x = j;
        }

        if(dist[x] == 0x3f3f3f3f)
        {
            cout << "impossible";
            return;
        }

        st[x] = 1;
        res += dist[x];
        for(int j = 1; j <= n; j++)
        {
            if(dist[j] > g[x][j] && !st[j])
            {
                dist[j] = g[x][j];
                pre[j] = x;
            }
        }
    }
    cout << res;

}

void getPath()
{
    for(int i = n; i > 1; i--)
    {
        cout << i << " " << pre[i] << " " << endl;
    }
}

int main()
{
    memset(g, 0x3f, sizeof g);
    cin >> n >> m;
    while(m --)
    {
        int a, b, c;
        cin >> a >> b >> c;
        g[a][b] = g[b][a] = min(g[a][b], c);
    }
    prim();
    //getPath();
    return 0;
}


/*
每次将离连通部分最近的点和点对应的边加入到连通部分.

*/

0 条评论

目前还没有评论...