传送门:
http://poj.org/problem?id=1251
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=406
POJ RE死了,改成cin救过了。。不过ZOJ原来的就能过,估计是POJ的数据多了个空格什么的。
1.prim
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int MAXN=27; const int INF=99999; int dis[MAXN]; int map[MAXN][MAXN]; int n; void prim() { bool vis[MAXN]={0}; for(int i=0;i<n;i++) dis[i]=INF; int cur=0; vis[cur]=1; dis[cur]=0; for(int i=0;i<n;i++) { int mini=INF; for(int j=0;j<n;j++) if(!vis[j] && map[cur][j] !=INF && dis[j] > map[cur][j])//先选出地图上权值小的 dis[j]=map[cur][j]; for(int j=0;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<n;i++) for(int j=0;j<n;j++) map[i][j]=INF; for(int i=0;i < n-1;i++) { char temp; int from,len,to,cost; cin>>temp>>len; from=temp-'A'; while(len--) { cin>>temp>>cost; to=temp-'A'; map[from][to]=map[to][from]=cost; } } prim(); int sum=0; for(int i=0;i<n;i++) sum+=dis[i]; printf("%d\n",sum); } return 0; }
#include<cstdio> #include<cstring> const int MAXN=27; const int INF=99999; int dis[MAXN]; int map[MAXN][MAXN]; int n; void prim() { bool vis[MAXN]={0}; for(int i=0;i<n;i++) dis[i]=INF; int cur=0; vis[cur]=1; dis[cur]=0; for(int i=0;i<n;i++) { int mini=INF; for(int j=0;j<n;j++) if(!vis[j] && map[cur][j] !=INF && dis[j] > map[cur][j])//先选出地图上权值小的 dis[j]=map[cur][j]; for(int j=0;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<n;i++) for(int j=0;j<n;j++) map[i][j]=INF; for(int i=0;i < n-1;i++) { getchar(); char temp; int from,len,to,cost; scanf("%c %d",&temp,&len); from=temp-'A'; for(int j=0;j<len;j++) { scanf(" %c %d",&temp,&cost); to=temp-'A'; map[to][from]=map[from][to]=cost; } } prim(); int sum=0; for(int i=0;i<n;i++) sum+=dis[i]; printf("%d\n",sum); } return 0; }
方法2 kruskal
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN=28; const int INF=99999; int dis[MAXN]; int n,city_cnt,sum; int fa[MAXN]; struct city { int x,y; int cost; }a[MAXN*MAXN]; bool operator <(const city &x,const city &y) { return x.cost<y.cost; } int find(int cur) { return fa[cur]==cur? cur: fa[cur]=find(fa[cur]); } int main() { while(scanf("%d",&n),n) { sum=city_cnt=0; for(int i=0;i < n-1;i++) { char temp; int from,num,to,cost; cin>>temp>>num; from=temp-'A'; while(num--) { cin>>temp>>cost; to=temp-'A'; a[city_cnt].x=from; a[city_cnt].y=to; a[city_cnt++].cost=cost; } } sort(a,a+city_cnt); for(int i=0;i<n;i++) fa[i]=i; for(int i=0;i<city_cnt;i++) { int root_x=find(a[i].x); int root_y=find(a[i].y); if(root_x!=root_y) { sum+=a[i].cost; fa[root_x]=root_y; } } printf("%d\n",sum); } return 0; }