Prim

 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
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int cost[1020][1020];//cost[u][v]表示边e=(u,v)的权值
int mincost[1020];//从集合X出发的边到每个顶点的最小权值
bool used[1020];//顶点i是否包含在集合X中
int N,M,S,E,W;
int prime()
{
    for(int i=1;i<=N;i++)
    {
        mincost[i]=INF;
        used[i]=false;
    }
    mincost[1]=0;
    int res=0;
    while(true)
    {
        int v=-1;//从不属于X的顶点中选取从X到其权值最小的顶点
        for(int u=1;u<=N;u++)
        {
            if(!used[u]&&(v==-1||mincost[u]<mincost[v]))
                v=u;
        }
        if(v==-1)break;
        used[v]=true;//把顶点v加入X
        res+=mincost[v];//把边的长度加到结果里
        for(int u=1;u<=N;u++)
        mincost[u]=min(mincost[u],cost[v][u]);
    }
    return res;
}
int main()
{
    cin>>N>>M;
    memset(cost,INF,sizeof(cost));
    for(int i=0;i<M;i++)
    {
        cin>>S>>E>>W;
        cost[S][E]=min(W,cost[S][E]);
        cost[E][S]=min(W,cost[E][S]);
    }
    cout<<prime()<<endl;
    return 0;
}