最小生成樹——hdu 4463

題目——————》 hdu 4463


第一次寫最小生成樹。粗心犯了一個錯誤 調啊調啊調了半個多小時

然後陷入了理所當然的思維,調了一個多小時才找到錯誤。

當 nike 和 apple 這條路是一定需要修建的 所以一開始我就把這兩個頂點給直接排除掉了

然而 就也許會導致錯誤。啊 說的不清楚

直接看代碼

我好餓。。。。先去喫飯 稍後補註釋

用的是prim算法 之後會再補上k算法

#include<iostream>
#include<cstdio>
#include<cmath>
#include<iomanip>
using namespace std;


struct Node  //節點
{
	int x;
	int y;
};

Node node[52];

typedef struct graph{   //圖
	Node *vexs;
	double matrix[52][52];  //用於記錄i與j之間的權值
};

graph g;

double calculate(int x1, int x2, int y1, int y2){
	return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2));
}

void createGraph(int n){  //創建全連通圖
	g.vexs = node;
	double l;
	for (int i = 1; i <= n; i++){
		g.matrix[i][i] = 0;
		for (int j = i+1; j <= n; j++){
			l = calculate(node[i].x, node[j].x, node[i].y, node[j].y);
			g.matrix[i][j] = g.matrix[j][i] = l;
		}
	}
}

double prim(int nike,int apple,int n){
	int i,j,k;
	double weights[52];               //此可以數組理解爲 對於要加入當前節點時邊的權值
	double sum = g.matrix[nike][apple];
	for (i = 1; i <= n; i++){                     //將nike和apple這條加入,並且更新數組 
		weights[i] = g.matrix[apple][i];
		if (weights[i] > g.matrix[nike][i]){
			weights[i] = g.matrix[nike][i];
		}
	}
	weights[nike] = 0;

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

		double min = 100000;
		for (j = 1; j <= n; j++){
			if (weights[j] != 0 && weights[j] < min){
				min = weights[j];
				k = j;
			}
		}
		sum += min;
		weights[k] = 0;
		for (j = 1; j <= n; j++){
			if (weights[j] != 0 && g.matrix[k][j] < weights[j]){
				weights[j] = g.matrix[k][j];
			}
		}
	}
	return sum;
}

int main(){

//	freopen("TestDate.txt", "r", stdin);

	int n;
	int index_Nike;
	int index_Apple;
	while (cin >> n && n != 0){
		cin >> index_Nike >> index_Apple;

		for (int i = 1; i <= n; i++){
			cin >> node[i].x >> node[i].y;
		}



		createGraph(n);

		double result = prim(index_Nike, index_Apple, n);

		cout << fixed << setprecision(2) << result << endl;

	}
	return 0;
}

補充K算法。

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

#define MAX 52

struct Node
{
	int x;
	int y;
};

Node node[MAX];

struct Edge
{
	int index_a;
	int index_b;
	double weight;
};

Edge edge[MAX*(MAX - 1)];

double calculate(int x1, int x2, int y1, int y2){
	return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2));
}

int createEdge(int n){
	int i, j ,k;
	k = 0;
	for (i = 1; i <= n; i++){
		for (j = i; j <= n; j++){
			edge[k].index_a = i;
			edge[k].index_b = j;
			edge[k].weight = calculate(node[i].x, node[j].x, node[i].y, node[j].y);
			k++;
		}
	}
	return k;
}

bool compare(Edge a, Edge b){
	return a.weight < b.weight;
}

int get_end(int vends[], int start){
	int k = start,j = start;
	while (vends[k] != k){
		k = vends[k];
	}
	int swap;
	while (vends[j] != k){
		swap = vends[j];
		vends[j] = k;
		j = swap;
	}
	return k;
}

double kruskal(int nike,int apple,int edgenum,int n){
	double result = 0;
	int vends[MAX];

	int i;

	for (i = 1; i <= n; i++){
		vends[i] = i;
	}

	for (i = 0; i < edgenum; i++){
		if ((edge[i].index_a == nike && edge[i].index_b == apple) || (edge[i].index_a == apple && edge[i].index_b == nike)){
			result += edge[i].weight;
			vends[nike] = apple;
			vends[apple] = apple;
			edge[i].weight = 0;
			break;
		}
	}

	sort(edge, edge + edgenum, compare);

	int k1, k2;
	for (i = 0; i < edgenum; i++){
		if (edge[i].weight == 0){
			continue;
		}
		k1 = get_end(vends, edge[i].index_a);
		k2 = get_end(vends, edge[i].index_b);
		if (k1 != k2){
			vends[k1] = k2;
			result += edge[i].weight;
		}
	}

	return result;
}

int main(){
	freopen("TestDate.txt","r",stdin);
	int n;
	int index_Nike;
	int index_Apple;
	while (cin >> n && n != 0){
		cin >> index_Nike >> index_Apple;
		                                                                                                                               
		for (int i = 1; i <= n; i++){
			cin >> node[i].x >> node[i].y;
		}

		int edgenum = createEdge(n);

		
		double result = kruskal(index_Nike, index_Apple, edgenum,n);

		cout << fixed << setprecision(2) << result << endl;

	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章