题目描述
输入
输出
示例输入
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;
 }