您的位置:首页 > 其它

poj 1751 prim

2012-02-15 09:10 162 查看
题目是说给了城镇的一些坐标,然后一些城镇是连通的,所以让连通的这些点的距离为0,然后用一个数组记录前驱,prim就可以求出来了,注意自己的答案不一定和上面的一样,因为是special judge,加油啊!~~~

#include <iostream>
#include <stdio.h>

using namespace std;
const int maxn=755;
const int maxm=1005;
const int inf=100000005;
int n,q;
struct node1
{
int x;
int y;
}map[maxn];
int dist[maxn];
int m[maxn][maxn];
int co[maxn][maxn];
int pre[maxm];
void prim()
{
bool visit[maxn];
int k;
int minn;
for(int i=1;i<=n;i++)
{
dist[i]=m[1][i];
visit[i]=false;
}
visit[1]=true;
dist[1]=0;
for(int i=1;i<=n-1;i++)
{
minn=inf;
k=0;
for(int j=1;j<=n;j++)
{
if(visit[j]==false&&dist[j]<minn)
{
minn=dist[j];
k=j;
}
}
if(minn!=0)printf("%d %d\n",pre[k],k);
if(k==0)return;
visit[k]=true;
for(int j=1;j<=n;j++)
{
if(visit[j]==false&&dist[j]>m[k][j]&&m[k][j]!=inf)
{
dist[j]=m[k][j];
pre[j]=k;
}
}
}
}
int main()
{
freopen("in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&map[i].x,&map[i].y);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j)m[i][j]=inf;
else m[i][j]=0;
}
}
for(int i=1;i<=maxm;i++)
{
pre[i]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(i!=j)
{
m[i][j]=m[j][i]=(map[i].x-map[j].x)*(map[i].x-map[j].x)+(map[i].y-map[j].y)*(map[i].y-map[j].y);
}
}
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
m[a][b]=m[b][a]=0;
}
prim();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: