poj2395 & poj 1751

来源:互联网 发布:sql字段添加内容 编辑:程序博客网 时间:2024/04/29 21:12

poj 2395 prim的模板题,没有什么可以说的。

1751 还是prim。只是有的边已经处理好了,不用继续处理。边的权值改为0,求最小生成树。

边!0 就输出!

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;


int n;
double value[1000][1000]={};
struct node
{
int x,y;
};
node data[1000]={};
struct node2
{
int index;
double dis;
};
void prim()
{
bool visit[1000]={0};
visit[1] = 1;
node2 dis[1000];
for(int i = 1; i <= n; i++)
{
dis[i].dis = value[1][i];
dis[i].index = 1;
}
for(int i = 2; i <= n; i++)
{
double mi = 1000000000000001;
int mark;
for(int j = 1; j <= n; j++)
 if(!visit[j] && dis[j].dis < mi)
 {
mark = j;
mi = dis[j].dis;
 }
if(mi > 0.5)
 printf("%d %d\n",dis[mark].index,mark);
visit[mark] = 1;
for(int j = 1; j <= n; j++)
 if(!visit[j] && value[mark][j] < dis[j].dis)
 {
 dis[j].index = mark;
 dis[j].dis = value[mark][j];
 }
}
}
int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; i++)
 scanf("%d%d",&data[i].x,&data[i].y);
for(int i = 1; i < n; i++)
 for(int j = i +1 ; j <= n; j++)
 {
 double dis = (data[i].x - data[j].x)*(data[i].x - data[j].x) + (data[i].y - data[j].y)*(data[i].y - data[j].y);
 value[i][j] = value[j][i] = dis;
 }
int m,x,y;
scanf("%d",&m);
for(int i = 0; i < m; i++)
{
scanf("%d%d",&x,&y);
value[x][y] = 0;
value[y][x] = 0;
}
prim();
return 0;
}

0 0