/*
#include <iostream>
using namespace std;
void prim()
{
const int INF = 65536;//表示无穷大
const int N = 100;//N为图中所有的节点数
bool visited[N+1] = {false};//数组visited保存节点是否有被访问过,初始化为false
int low[N+1];//保存已访问节点离未访问节点的最短距离
int dist[N+1][N+1];//距离矩阵,用来保存图中节点之间的距离
int result = 0;//最短距离
int edge[N+1];//用来保存选择的点的依附节点
int min = INF;
int v;
//初始化矩阵/
for (int i=1; i<=N; ++i)
{
for (int j=1; j<=N; ++j)
{
if (i == j)
{
dist[i][j] = 0;
}
else
dist[i][j] = INF;
}
}
//输入边的信息//
int m, a, b, c, n;
cout << "输入总的顶点数,边数:";
cin >> n >> m;
cout << "输入边的两个节点和边的长短:" << endl;
for (int i=1; i<=m; ++i)
{
cin >> a >> b >> c;
dist[a][b] = dist[b][a] = c;
}
//
visited[1] = true;//我们选取第一个节点为初始节点
low[1] = 0;
edge[1] = 1;
//初始化low和edge
for (int i=2; i<=n; ++i)
{
low[i] = dist[1][i];
edge[i] = 1;//初始化所有的节点依附节点为节点1
}
//循环N-1次,来求得最小生成树所花费的最短路径,因为有N个点,所以树有N-1个边
for (int i=1; i<n; ++i)
{
min = INF;
for (int j=1; j<=n; ++j)
{
if (!visited[j] && low[j]<min)//如果节点j没有被访问过并且当前路径小于min
{
min = low[j];
v = j;
}
}
//找到未被访问的节点V路径最短
result += min;
visited[v] = true;
cout << "(" << v << "," << edge[v] << ")" << endl;//输出找到的这个点所依附的节点,相当于输出一条边
//更新数组low和edge
for (int i=1; i<=n; ++i)
{
if (!visited[i] && low[i]>dist[v][i])//如果节点i没有被访问过并且当前路径小于已知的路径low
{
low[i] = dist[v][i];
edge[i] = v;//将节点i的新依附节点设置为找到的节点v
}
}
}
cout << result << endl;
return ;//完毕后,得到的result即为最小生成树最短路径长度,数组edge即为选择的节点边的信息
}
int main()
{
prim();
return 0;
}
输入总的顶点数,边数:7 9
输入边的两个节点和边的长短:
1 2 28
1 6 10
2 3 16
2 7 14
3 4 12
4 5 22
4 7 18
5 6 25
5 7 24
(6,1)
(5,6)
(4,5)
(3,4)
(2,3)
(7,2)
99
Process returned 0 (0x0) execution time : 22.609 s
Press any key to continue.
*/