http://poj.org/problem?id=1287
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=372
和上次那题差不多。
边和好久不联系的笔友聊天边敲~哈哈哈哈,一次AC,水
Kruskal
#include<cstdio> #include<algorithm> using namespace std; const int N=55; const int MAXN=3000; int n,sum; int fa[N]; struct dot { int x,y; int len; }data[MAXN]; bool operator < (const dot & a,const dot &b) { return a.len<b.len; } int find(int cur) { return cur==fa[cur]? cur: fa[cur]= find(fa[cur]); } int main() { while(scanf("%d",&n),n) { int num; scanf("%d",&num); for(int i=0;i<num;i++) { scanf("%d%d%d",&data[i].x,&data[i].y,&data[i].len); } sort(data,data+num); for(int i=0;i<=n;i++) fa[i]=i; sum=0; for(int i=0;i<num;i++) { int root_x=find(data[i].x); int root_y=find(data[i].y); if(root_x!=root_y) { sum+=data[i].len; fa[root_x]=root_y; } } printf("%d\n",sum); } return 0; }
12/7更新Prim算法
洗洗睡吧。
#include<cstdio> #include<algorithm> using namespace std; const int MAXN=55; const int INF=999999; int dis[MAXN],map[MAXN][MAXN]; int sum; int n,num; void prim() { bool vis[MAXN]={0}; for(int i=1;i<=n;i++) dis[i]=INF; int cur=1; vis[cur]=1; dis[cur]=0; for(int i=1;i<=n;i++) { int mini=INF; for(int j=1;j<=n;j++) if(!vis[j] && dis[j] > map[cur][j])//先选出地图上权值小的 dis[j]=map[cur][j]; for(int j=1;j<=n;j++) if(!vis[j] && mini> dis[j]) mini=dis[cur=j]; vis[cur]=1; } } int main() { while(scanf("%d",&n),n) { for(int i=0;i<MAXN;i++) for(int j=0;j<MAXN;j++) map[i][j]=INF; scanf("%d",&num); for(int i=0;i<num;i++) { int x,y,len; scanf("%d%d%d",&x,&y,&len); if(map[x][y] > len) map[y][x]=map[x][y]=len; } sum=0; prim(); for(int i=1;i<=n;i++) sum+=dis[i]; printf("%d\n",sum); } return 0; }