本来以为对最小生成树的学习告一段落了,昨晚跟波波聊的时候他说Prim不一定比Kruskal慢,于是我就拿1789来开刀。果然,于是我先用Kruskal,ac,1641MS,恩,不错.再用Prim写,一交,果然TimeLimitExeeded!!看来波波错了,但是他是已经ac了的..看看他的时间,只有375MS,不算cin的时间消耗他的程序比我快了足足3倍!!看他的解题报告,原来他用的储存结构和我的不一样..换他的那种方法试试,ac,282MS.orz,幸好有他提醒,不然我就用Kruskal一辈子了...现在把1789贴出来,等会儿再刷几道最小生成树的~
AccecptTime: 2008-12-22 10:30:23
Language: C++
Memory: 15624K
Time: 282MS
Errors: 2 TL
Algorithm: Prim
- #include <stdio.h>
- #include <memory.h>
- #include <algorithm>
- #include <iostream>
- using namespace std;
- // 最大值
- #define INF 99999999
- // 最多的边数
- #define N 2000
- // 路径储存
- int road[N][N];
- char type[N][8];
- int main()
- {
- int n,m,count;
- int i,j,k,l;
- int mink,min,res;
- while(true) {
- scanf("%d",&n);
- if(!n)
- break;
- // 以下是将字符串转换为邻接矩阵
- getchar();
- for(i = 0; i < n; i++)
- gets(type[i]);
- for(i = 0; i < n; i++) {
- road[i][i] = -1;
- for(j = i + 1; j < n;j++) {
- count = 0;
- for(k = 0; k < 7; k++)
- if(type[i][k] != type[j][k])
- count++;
- road[i][j] = road[j][i] = count;
- }
- }
- //Prim最小生成树
- res = 0;
- int lesscost[N];
- for(i = 0; i < n;i++)
- lesscost[i] = road[0][i];
- for( i = 1; i < n ;i++) {
- min = INF;
- for(j = 0; j < n; j++)
- if(lesscost[j] >= 0 && lesscost[j] < min) {
- min = lesscost[j];
- mink = j;
- }
- res += min;
- // 将刚加入集合的节点的所有边和现有边做一个比较,保留小的边
- for(j = 0; j < n;j++)
- if(lesscost[j] > road[mink][j])
- lesscost[j] = road[mink][j];
- }
- printf("The highest possible quality is 1/%d./n",res);
- }
- }