Prim最小生成树1.2

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define maxn 102
#define INF 1000000
using namespace std;
int n, m;
int graph[maxn][maxn];
int lowcost[maxn];
int visited[maxn];
void createGraph()
{
    memset(graph, 0, sizeof(graph));
    memset(lowcost, 0, sizeof(lowcost));
    memset(visited, 0, sizeof(visited));
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            graph[i][j] = INF;
    int u, v, w;
    for(int i = 0; i < m; i++)  //m条道路;
    {
        cin >> u >> v >> w;
        graph[u][v] = graph[v][u] = w;
        //graph[u][v]=graph[v][u]=w;无方向图;
    }
    /*
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        graph[i][j]==INF;
    int u,v,w;
    for(int i=0;i<m;i++)
    {
    cin>>u>>v>>m;
    graph[u][v]=graph[v][u]=w;
    }
            */
}
void prim()
{
    int sum = 0, cnt = 0;
    visited[1] = 1;
    for(int i = 1; i <= n; i++)
    {
        lowcost[i] = graph[1][i];//第1个点到达的代价;
    }
    while(true)
    {
        int minn = lowcost[1], k = 1;//lowcost[1]是初始化的无穷;
        for(int j = 2; j <= n; j++)
        {
            if(!visited[j] && lowcost[j] < minn)
            {
                minn = lowcost[j];//
                k = j;//每次选取最短的一条边;
            }
        }//找1点到其最短距离的点、距离及点
        if(k == 1) break;//没有再可以加的点;
        sum += minn;//每次加上权值;
        cnt++;//记录边个数;
        visited[k] = 1;//记录这个点已经被访问过;
        for(int t = 1; t <= n; t++)
        {
            if(!visited[t] && lowcost[t] > graph[k][t])
            {
                lowcost[t] = graph[k][t];//合并为同一集合;
            }
        }
    }
    if(cnt == n-1) printf("%d\n", sum);
    else printf("?\n");
}

int main()
{
    while(cin >> m >> n && m)
    {
        createGraph();
        prim();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/83120107
今日推荐