您的位置:首页 > 其它

1751 Highways 解题报告 2

2008-12-22 11:20 369 查看
AccecptTime: 2008-12-22 11:19:49

Language: C++
Memory: 2424K
Time: 94MS
Errors: No
Algorithm: Prim

#include <stdio.h>

#include <memory.h>

#include <algorithm>

#include <iostream>

using namespace std;

// 最大值

#define INF 99999999

#define len(i,j) ((i)*(i) + (j)*(j))

// 最多的边数

#define N 751

// 路径储存

int road

;

int main()

{

int n,m,count;

int i,j,k,l;

int mink,min,res;

scanf("%d",&n);

int x
,y
;

for(i = 1; i <= n; i++)

scanf("%d%d",&x[i],&y[i]);

for( i = 1; i <= n; i++)

for(j = 1; j <= n; j++)

if(i == j)

road[i][j] = -1;

else

road[i][j] = road[j][i] = len(x[i] - x[j],y[i] - y[j]);

scanf("%d",&m);

int u,v;

for(i = 0; i < m;i++) {

scanf("%d%d",&u,&v);

road[v][u] = road[u][v] = 0;

}

//Prim最小生成树

res = 0;

int lesscost
;

//用于记录边的源节点

int ori
;

for(i = 1; i <= n;i++) {

lesscost[i] = road[1][i];

ori[i] = 1;

}

for( i = 1; i < n ;i++) {

min = INF;

for(j = 1; j <= n; j++)

if(lesscost[j] >= 0 && lesscost[j] < min) {

min = lesscost[j];

mink = j;

}

if(min > 0)

printf("%d %d/n",ori[mink],mink);

// 将刚加入集合的节点的所有边和现有边做一个比较,保留小的边

for(j = 1; j <= n;j++)

if(lesscost[j] > road[mink][j]) {

lesscost[j] = road[mink][j];

ori[j] = mink;

}

}

}

经过波波思想的洗礼,我决定用Prim将那些"应该用Prim的题目"再做一遍,果然,Prim太强大了...只用了94MS,比之前用Kruskal快了3倍...我开始怀疑自己的Kruskal是否已经足够强了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: