1001-专题四

来源:互联网 发布:爱的算法免费下载 编辑:程序博客网 时间:2024/06/06 09:32

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;}


0 0