PTA 7-11(图) 公路村村通(30 分) 最小生成树prim

来源:互联网 发布:平面设计软件有哪些 编辑:程序博客网 时间:2024/05/22 03:10

最小生成树 prim 算法,

注意判非联通


#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <cmath>#include <set>#include <map>#include <stack>#include <queue>#include <ctype.h>#include <vector>#include <algorithm>#include <sstream>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;const int maxn = 1000 + 7, INF = 0x3f3f3f3f, mod = 1e9 + 7;int n, m;int ans[maxn], vis[maxn];struct node {    int v, co;    node() {}    node(int v, int d) :v(v), co(d) {}};vector<node> a[maxn];void init() {    scanf("%d %d", &n, &m);    int u, v, d;    for(int i = 0; i < m; ++i) {        scanf("%d %d %d", &u, &v, &d);        a[u].push_back(node(v, d));        a[v].push_back(node(u, d));    }}void solve() {    memset(ans, INF, sizeof ans);    memset(vis, 0, sizeof vis);    for(int i = 0; i < a[1].size(); ++i)        ans[a[1][i].v] = a[1][i].co;    ans[1] = 0; vis[1] = 1;    int anss = 0;    while(1) {        int t = -1;        for(int i = 2; i <= n; ++i) {            if(!vis[i] && (t == -1 || ans[i] < ans[t])) t = i;        }        if(t != -1 && ans[t] == INF) { cout << "-1" << endl; return ; }        if(t == -1) break;        vis[t] = 1; anss += ans[t];        for(int i = 0; i < a[t].size(); ++i)            if(ans[a[t][i].v] > a[t][i].co) ans[a[t][i].v] = a[t][i].co;    }    cout << anss << endl;}int main() {    init();    solve();    return 0;}/*6 151 2 51 3 31 4 71 5 41 6 22 3 42 4 62 5 22 6 63 4 63 5 13 6 14 5 104 6 85 6 3*/