2144-数据结构实验之图论九:最小生成树

来源:互联网 发布:js选择文件保存路径 编辑:程序博客网 时间:2024/06/07 06:19
#include <iostream>#include <cstdio>#include <cstring>#define MAX 0x3f3f3f3fusing namespace std;int map[1123][1123];int vis[1123];int lowcost[1123];int flag, sum;void prim_MST(int n){    flag = 0;    sum = 0;    int k = 1;    for(int i = 1; i <= n; i++)    {        lowcost[i] = map[i][1]; /// 初始化    }    vis[1] = 1;    for(int i = 2; i <= n; i++)    {        int t = MAX;        for(int j = 1; j <= n; j++)        {            if(!vis[j] && t > lowcost[j]) /// 找到点未访问且权值最小的边            {                t = lowcost[j];                k = j; /// 记录该点            }        }        if(t == MAX) /// 没有符合条件的点即此图不连通        {            //cout << "-1" << endl;            flag = 1;            return ;        }        vis[k] = 1;        sum+=t; /// 权值累加        for(int j = 1; j <= n; j++)        {            if(!vis[j] && map[j][k] < lowcost[j]) /// 如果此时点未访问且权值小于此时lowcost的值            {                lowcost[j] = map[j][k]; /// 更新            }        }    }}int main(){    int n, m, cost;    while(cin >> n >> m)    {        ///map初始化为无穷大,不是初始化为0;        for(int i = 1;i <= n;i++)        {            for(int j = 1;j <= n;j++)            {                if(i == j)                    map[i][j] = 0;                else                    map[i][j] = MAX;            }        }        memset(vis, 0, sizeof(vis));        while(m--)        {            int u, v;            cin >> u >> v >> cost;            if(map[u][v] > cost) /// 窝草 重边是什么鬼!!!坑死了!!!!QAQ            {                map[u][v] = map[v][u] = cost;             }        }        prim_MST(n);        if(!flag)        {            cout << sum << endl;        }    }    return 0;}
原创粉丝点击