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