Constructing Roads(最短路徑)

描述:

There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are connected, if and only if there is a road between A and B, or there exists a village C such that there is a road between A and C, and C and B are connected. 

We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.


輸入:

The first line is an integer N (3 <= N <= 100), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 1000]) between village i and village j.

Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.


輸出:

You should output a line contains an integer, which is the length of all the roads to be built such that all the villages are connected, and this value is minimum.


樣例輸入:

3
0 990 692
990 0 179
692 179 0
1
1 2


樣例輸出:

179



題目大意:

先輸入一個正整數n代表n個城鎮,接下去是n*n的一個二維數組第i行第j列的數代表城鎮i和j之間的距離。再輸入一個正整數x,接下去x行每行有兩個正整數x1,y1.代表城鎮x1與y1之間已經有道路連接。求爲使得全部城鎮連通最短還有造多少長的路。



/*
此題的方法與Frogger那道相同*/ 
#include<stdio.h>
#include<string.h>
#include<limits.h>
int map[105][105],dis,mark[105],asd[105],n,t;
void prim()													//prim算法 
{
	for(int i=1;i<=n;i++)
	asd[i]=map[1][i];
	mark[1]=1;
	int p,k;
	for(int i=1;i<=n;i++)
	{
		p=INT_MAX;
		for(int j=1;j<=n;j++)
		{
			if(mark[j]==0&&p>asd[j])
			{
				k=j;														//記錄下此時所在的位置 
				p=asd[j];
			}
		}
		if(p==INT_MAX)														//如果相等說明此時的道路已經全部連接 
		break;
		mark[k]=1;
		dis+=asd[k];
		for(int j=1;j<=n;j++)
		{
			if(mark[j]==0&&asd[j]>map[k][j])
			{
				asd[j]=map[k][j];
			}
		}
	}
}
int main()
{
	int a,b;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&map[i][j]);										 
		}
	}
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&a,&b);											//將已經建有道路的兩個城市x,y的map[x][y]置爲0 
		map[a][b]=0;
		map[b][a]=0;
	}
	dis=0;
	memset(mark,0,sizeof(mark));										//定義一個標誌變量判斷城市是否被訪問過 
	prim();
	printf("%d\n",dis);
	return 0;
} 


發佈了31 篇原創文章 · 獲贊 27 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章