传送门:
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;
}
下面是ZOJ AC 但是 POJ RE的就是输入格式不同。
#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;
}