题意:给出村庄之间两两的距离,求任意两个村庄都连通,所要建设的公路最短长度
解题思路:刚开始看到还以为是和第三题一样的,所以直接把第三题代码粘上去了,后来才发现不一样,读了一下题,和第一题差不多,第一题用的是kruskal,所以这题就试了一下prime。
感想:虽然题很水,但是还是要照着课本写,还是不能独立写出来
源码:
#include<iostream>
using namespace std;
const int N=110;
const int INF=0x3f3f3f3f;
int n,ans;
int imap[N][N],dis[N],vis[N];
void Prim(){
int i;
for(i=1;i<=n;i++){
dis[i]=imap[1][i];
vis[i]=0;
}
dis[1]=0;
vis[1]=1;
int j,k,tmp;
for(i=1;i<=n;i++){
tmp=INF;
for(j=1;j<=n;j++)
if(!vis[j] && tmp>dis[j]){
k=j;
tmp=dis[j];
}
if(tmp==INF)
break;
vis[k]=1;
ans+=dis[k];
for(j=1;j<=n;j++)
if(!vis[j] && dis[j]>imap[k][j])
dis[j]=imap[k][j];
}
}
int main(){
while(cin>>n&&n){
int num1,num2,temp;
for(int i=0;i<n*(n-1)/2;i++)
{
cin>>num1>>num2;
cin>>temp;
imap[num1][num2]=temp;
imap[num2][num1]=temp;
}
ans=0;
Prim();
cout<<ans<<endl;
}
return 0;
}
Problem D
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 59 Accepted Submission(s) : 25
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
3 5