pku2607.cpp

来自「这是ACM 方面的资料 是PKU的 北京大学的出来的」· C++ 代码 · 共 115 行

CPP
115
字号
#include <stdio.h>
#define size 510
#define TheMax 100000000
int D[size][size];
int F, I;
int Min[size];

int MinVal(int x, int y)
{
	return x < y ? x : y;
}

void init()
{
	int i, j;
	for (i = 0; i < I; i++)
	{
		Min[i] = TheMax;
		for (j = i + 1; j < I; j++)
		{
			D[i][j] = D[j][i] = TheMax;
		}
		D[i][i] = 0;
	}
}

void Floyd()
{
	int i, j, k;
	for (k = 0; k < I; k++)
	{
		for (i = 0; i < I; i++)
		{
			for (j = i + 1; j < I; j++)
			{
				if (D[i][j] > D[i][k] + D[k][j])
				{
					D[i][j] = D[j][i] = D[i][k] + D[k][j];
				}
			}
		}
	}
}

void FindMin()
{
	int i, j;
	for (i = 0; i < I; i++)
	{
		if (Min[i] == 0)
		{
			continue;
		}
		for (j = 0; j < I; j++)
		{
			if (Min[j] == 0)
			{
				if (Min[i] > D[i][j])
				{
					Min[i] = D[i][j];
				}
			}
		}
	}
}

int main()
{
	int i, j, k, tmp, f;
	int s, e, d;
	int maxdis, minid, minmax;
	scanf("%d %d", &F, &I);
	init();
	while (F--)
	{
		scanf("%d", &f);
		Min[f - 1] = 0;
	}
	while (scanf("%d %d %d", &s, &e, &d) != -1)
	{
		s--;
		e--;
		if (D[s][e] > d)
		{
			D[s][e] = D[e][s] = d;
		}
	}
	Floyd();
	
	FindMin();
	
	minid = -1;
	minmax = TheMax;

	for (i = 0; i < I; i++)
	{
		for (j = 0, maxdis = 0; j < I; j++)
		{
			tmp = MinVal(Min[j], D[i][j]);
			if (maxdis < tmp)
			{
				maxdis = tmp;
			}
		}
		if (maxdis < minmax)
		{
			minmax = maxdis;
			minid = i;
		}
	}
	printf("%d\n", minid + 1);
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?