记单词
继续看数据结构的树转换成森林
下午补周测题竟然一直错
然后开始看最小生成树的prim
prim是从一个点扩散到多个点,每次选择当前能够到的最短的点,每加入一个点就更新一下权值数组
#include <iostream>
using namespace std;
#define Max 100
#define Maxcost 0x7fffffff
int graph[Max][Max];
int prim(int graph[][Max],int n)
{
int lowcost[Max];//权值
int mst[Max];//起点
int i,j,min,mind,sum=0;
for(i=2;i<=n;i++)
{
lowcost[i]=graph[1][i];//1能到的点
mst[i]=1;//各点的起点
}
mst[1]=0;
for(i=2;i<=n;i++)
{
min=Maxcost;
mind=0;
for(j=2;j<=n;j++)
{
if(lowcost[j]<min&&lowcost[j]!=0)
{
min=lowcost[j];//找最小权值的边
mind=j;
}
}
sum+=min;
lowcost[mind]=0;//表示已经加入
for(j=2;j<=n;j++)
{
if(graph[mind][j]<lowcost[j])//新的顶点加入扩展新的路径进行比较,比他大就替换
{
lowcost[j]=graph[mind][j];
mst[j]=mind;//更换起点
}
}
}
return sum;
}
int main()
{
int i,j,k,m,n;//m代表顶点个数,n代表边
int cost;
cin >> m >>n;
for(i=1;i<=m;i++)//初始化图
{
for(j=1;j<=m;j++)
{
graph[i][j]=Maxcost;
}
}
for(k=1;k<=n;k++)//建图
{
cin >> i >> j >> cost;
graph[i][j]=cost;//i点到j点的花费
graph[j][i]=cost;//同理
}
cost=prim(graph,m);
cout << cost;
}