您的位置:首页 > 其它

poj1258 Agri-Net

2014-03-17 09:31 148 查看
题目:http://poj.org/problem?id=1258

题意:给出一个矩阵,表示第i个农场与第j个农场的距离,求把农场连起来的最短距离。

想法:Kruskal与prim都写了一下。写kruskal遇到点困难,不知道错哪了,改着改着就对了。kruskal和并查集好像有木有。。

代码:

prim

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int dis[110];
int link[110][110];
bool vis[110];
int n;
int ans;
void prim(){
for(int i=1;i<=n;i++)
dis[i]=INF;
dis[1]=0;
ans=0;
for(int i=1;i<=n;i++){
int minn=INF,pos;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<minn){
minn=dis[j];
pos=j;
}
}
ans+=dis[pos];
vis[pos]=true;
for(int k=1;k<=n;k++){
if(!vis[k]&&dis[k]>link[pos][k])
dis[k]=link[pos][k];
}
}
cout<<ans<<endl;
}
int main(){
//freopen("123.txt","r",stdin);
while(~scanf("%d",&n)){
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>link[i][j];
}
}
prim();
}
return 0;
}


kruskal

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node{
int x,y;
int cost;
}point[110*110];
bool cmp(Node a,Node b){
return a.cost<b.cost;
}
int fa[110];
int n,ans;
int find(int x){
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}

int main(){
//freopen("123.txt","r",stdin);
while(~scanf("%d",&n)){
int t=0,c;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c;
if(i!=j){
point[t].x=i;
point[t].y=j;
point[t].cost=c;
t++;
}
}
}
sort(point,point+t,cmp);
for(int i=1;i<=n;i++)   fa[i]=i;
int num=0,ans=0;
for(int i=0;i<t;i++){
int ex=find(point[i].x);
int ey=find(point[i].y);
if(ex!=ey){
ans+=point[i].cost;
fa[ex]=ey;
}
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: