题目大意:中文题目,并且是畅通工程的第三个版本不解释了,就是一道MST问题。
解题思路:很裸的一道MST,上一题的1102给出了详细的说明这里就不给出来了,发现这种题目最容易出错的是下标的控制,还是没有理解透彻,不能够灵活运用呀。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1233
Prim code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 105;
const int INF =0x3fffffff;
int n,a,b,c;
int map[MAXN][MAXN],vis[MAXN],dist[MAXN];
int Prim(){
int sum=0;
for(int i=1;i<=n;i++) dist[i]=(i==1?0:map[1][i]);
memset(vis,0,sizeof(vis));
vis[1]=1;
for(int i=1;i<n;i++){
int pos,minn=INF;
for(int j=1;j<=n;j++) if(!vis[j] && dist[j]<minn) minn=dist[pos=j];
vis[pos]=1;
sum+=minn;
for(int k=1;k<=n;k++)
if(!vis[k] && dist[k]>map[pos][k])
dist[k]=map[pos][k];
}
return sum;
}
int main(){
while(scanf("%d",&n)!=EOF && n){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
map[i][j]=INF;
for(int i=1;i<=n*(n-1)/2;i++){
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
int ans=Prim();
printf("%d\n",ans);
}
return 0;
}
Kruskal code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN =100+10;
int n,tmp;
int p[MAXN];
struct edge{
int u,v,w;
}e[MAXN*MAXN];
int cmp(const edge a,const edge b){return a.w<b.w;}
int find(int x){return x==p[x]?x:find(p[x]);}
int Kruskal(){
int ans=0;
for(int i=1;i<=n;i++) p[i]=i;
sort(e+1,e+1+tmp,cmp);
for(int i=1;i<=tmp;i++){
int x=find(e[i].u);
int y=find(e[i].v);
if(x!=y){
p[x]=y;
ans+=e[i].w;
}
}
return ans;
}
int main(){
while(scanf("%d",&n)!=EOF && n){
tmp=n*(n-1)/2;
for(int i=1;i<=tmp;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
int ans=Kruskal();
printf("%d\n",ans);
}
return 0;
}