#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;
}
Prim最小生成树1.2
猜你喜欢
转载自blog.csdn.net/lanshan1111/article/details/83120107
今日推荐
周排行