题目描述
输入
输出
示例输入
5 8
1 2 12
1 3 9
1 4 11
1 5 3
2 3 6
2 4 9
3 4 4
4 5 6
示例输出
19
提示
#include <iostream>
#include<cstdlib>
#include<cstdio>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
typedef struct arcnode
{
int adj;
}arcnode,adjmatrix[721][721];
typedef struct
{
adjmatrix a;
int vn;
int an;
}MG;
void create(MG &g,int n,int m)//生成邻接矩阵;
{
int i,j;
int v1,v2,w;
g.vn=n;
g.an=m;
for(i=1;i<=g.vn;i++)
for(j=1;j<=g.vn;j++)
if(i!=j)
g.a[i][j].adj=INF;
else
g.a[i][j].adj=0;
for(i=1;i<=g.an;i++)
{
scanf("%d%d%d",&v1,&v2,&w);
if(g.a[v1][v2].adj>w||g.a[v2][v1].adj>w)
g.a[v1][v2].adj=w; //有重复边选权值最小的保存
g.a[v2][v1]=g.a[v1][v2];
}
}
struct node
{
int adjvex;//存储已遍历的结点;
int lowcost;//存储最小权值;
}closedge[110];
int prim(MG &g,int k)
{
int i,j,mincost,sum=0;
for(j=1;j<=g.vn;j++)
if(j!=k)
{
closedge[j].adjvex=k;
closedge[j].lowcost=g.a[k][j].adj;
}
closedge[k].lowcost=0;//相当于将k点加入U集合(已连接的点集合)
for(i=2;i<=g.vn;i++) //求出下一个顶点K
{
mincost=INF;
for(j=1;j<=g.vn;j++)
if(closedge[j].lowcost<mincost&&closedge[j].lowcost!=0)
{
mincost=closedge[j].lowcost;
k=j;//找k的过程
}
if(mincost==INF)
return -1;
sum+=mincost;//最小花费;
closedge[k].lowcost=0;//相当于将k点加入U集合(已连接的点集合)
for(j=1;j<=g.vn;j++)
if(g.a[k][j].adj<closedge[j].lowcost)//更新原有代价
{
closedge[j].adjvex=k;
closedge[j].lowcost=g.a[k][j].adj;
}
}
return sum;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
MG g;
create(g,n,m);
printf("%d\n",prim(g,1));
}
return 0;
}
#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1011;
const int inf=0x3f3f3f3f;
int map[maxn][maxn];
int vis[maxn];
int dis[maxn];
void prim(int n)
{
int i,j,k;
int min1;
int sum=0,flag=0;
memset(vis,0,sizeof(vis));
for(i=0;i<=n;i++)
dis[i]=map[1][i];
vis[1]=1;
for(i=2;i<=n;i++)
{
min1=inf;
for(j=1;j<=n;j++)
{
if(min1>dis[j]&&!vis[j])
k=j,min1=dis[j];
}
if(min1==inf)
{flag=1;break;}
vis[k]=1;
sum+=min1;
for(j=1;j<=n;j++)
if(map[k][j]<dis[j]&&!vis[j])
dis[j]=map[k][j];
}
if(flag)
printf("-1\n");
else
printf("%d\n",sum);
}
int main()
{
int n,m,i,j;
int u,w,v;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
if(i==j)
map[i][j]=map[j][i]=0;
else
map[i][j]=map[j][i]=inf;
while(m--)
{
cin>>u>>v>>w;
if(w<map[u][v])
map[u][v]=map[v][u]=w;
}
prim(n);
}
return 0;
}