1001-专题四

1.题意:给出村子间的距离,以及已连接的村子,求村子联通需要修的最短路程

2.思路:路程相当于权数,离散数学的思想,我们上课讲的,prim,kruskal算法都可,思路不同,结论相同

3.感想:在这学期的数据结构中也有涉及。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
 
int gp[105][105];
int lowercost[105];
int used[105];
int n;
 
 int prim()
 {
     int i,j,k;
     int sum=0;
     used[1]=1;
     for(i=1;i<=n;i++)
     lowercost[i]=gp[1][i];
     for(i=2;i<=n;i++)
     {
         int pos;
         int temp=9999999;
         for(j=1;j<=n;j++)
         {
             if(lowercost[j]<temp&&!used[j])
            {
                 temp=lowercost[j];
                 pos=j;
             }
         }
         used[pos]=1;
         sum+=lowercost[pos];
         for(k=1;k<=n;k++)
         {
             if(gp[pos][k]<lowercost[k]&&!used[k])
             lowercost[k]=gp[pos][k];
         }
     }
    return sum;
 }
 
 int main()
 {
    int i,j,m,a,b;
     while(scanf("%d",&n)!=EOF)
     {
         memset(lowercost,0,sizeof(lowercost));
         memset(used,0,sizeof(used));
         for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
         scanf("%d",&gp[i][j]);
         scanf("%d",&m);
         while(m--)
        {
             scanf("%d%d",&a,&b);
             gp[a][b]=gp[b][a]=0;
         }
         int ans=prim();
         printf("%d\n",ans);
     }
     return 0;
}


你可能感兴趣的:(1001-专题四)