當前位置:首頁 > 資訊 > info6 > 正文

ZOJ 2048 highways

發表于: 2014-05-10   作者:chen_xinjia   來源:轉載   瀏覽:
摘要: 題目比我想象地要容易很多。。一開始想得太復雜了,本來想試一下kruskal算法的,嫌麻煩。。還是用了之前1203的prim算法。。。以為要注意這道題的輸出順序,結果不用,直接輸出就可以了,就是注意一下空行的輸出就行了//#include"stdafx.h" #include #include"stdio.h" #include usingnamespacestd; inttown[750][2];

題目

比我想象地要容易很多。。一開始想得太復雜了,本來想試一下kruskal算法的,嫌麻煩。。還是用了之前1203的prim算法。。。以為要注意這道題的輸出順序,結果不用,直接輸出就可以了,就是注意一下空行的輸出就行了

//#include "stdafx.h"
#include <iostream>
#include "stdio.h"
#include <math.h>
using namespace std;
int town[750][2];
double dis[750][750];
double ans;
int n;
void prim()
{
	int temp[750];  //存放已經加入的結點  
	int size;    // 已加入的結點個數  
	int i, j, k;
	int lastnode1 = 0, curnode, pos2;
	double min;


	temp[0] = 0;
	size = 1;

	dis[0][0] = 1;

	for (i = 0; i < n - 1; i++)//執行n-1次將所有的點訪問完  
	{
		min = 32767; // 極大值  
		for (j = 0; j < size; j++)
		{
			curnode = temp[j];
			for (k = 0; k < n; k++)
			if (dis[curnode][k] <= min && dis[k][k] == 0) //min 為當前最小值,為0表示沒有訪問過,如果新加入結點后有再小的邊就將對應的點加入  
			{
				min = dis[curnode][k];
				lastnode1 = curnode;

				pos2 = k;
			}
		}
		if (min != 0)
		{

			cout << lastnode1 + 1 << " " << pos2 + 1 << endl;//ans += min;
		}
		dis[pos2][pos2] = 1;//表示已經訪問過
		temp[size] = pos2; size++;

	}
}
int main()
{
	int T, M = -1, E;
	cin >> T;
	while (T--)
	{
		memset(dis, 0, sizeof(dis));
		cin >> n;
		for (int i = 0; i < n; i++)
		{
			cin >> town[i][0] >> town[i][1];//輸入town 的坐標
		}
		for (int i = 0; i < n; i++)
		{
			for (int j = i + 1; j < n; j++)//計算每兩個點之前的距離
			{

				dis[j][i] = dis[i][j] = sqrt(pow(town[i][0] - town[j][0], 2) + pow(town[i][1] - town[j][1], 2));        //計算兩點間的距離  
			}
		}
		cin >> E;
		int x, y;
		while (E--)
		{
			cin >> x >> y;
			dis[x - 1][y - 1] = 0;
			dis[y - 1][x - 1] = 0;

		}
		
		prim();
		if (T)
		cout << endl;
	}
	return 0;
}


ZOJ 2048 highways

版權所有 IT知識庫 CopyRight ? 2009-2015 IT知識庫 IT610.com , All Rights Reserved. 京ICP備09083238號
广东25选5开奖结果