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[N][N];
- int main()
- {
- int n,m,count;
- int i,j,k,l;
- int mink,min,res;
- scanf("%d",&n);
- int x[N],y[N];
- 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[N];
- //用于记录边的源节点
- int ori[N];
- 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是否已经足够强了.