POJ 1125 解题报告

这道题就是求all pairs shortest paths。所以可以跑N次Dijkstra或SPFA(shortest path faster algoritm: http://en.wikipedia.org/wiki/Shortest_Path_Faster_Algorithm),或者floyd-warshall或者johnson's algorithm(http://en.wikipedia.org/wiki/Johnson%27s_algorithm)。最简单的应该就是floyd了。

这里参照的是wiki上的伪代码:http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm

1125Accepted752K0MSG++1699B

/* 
ID: thestor1 
LANG: C++ 
TASK: poj1125 
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cassert>

using namespace std;

const int MAXN = 100;
std::vector<std::vector<int> > dis(MAXN, std::vector<int>(MAXN, -1));

int main()
{
	int N;
	while (cin >> N && N)
	{
		for (int u = 0; u < N; ++u)
		{
			for (int v = 0; v < N; ++v)
			{
				dis[u][v] = -1;
			}
			dis[u][u] = 0;
		}

		for (int u = 0; u < N; ++u)
		{
			int n;
			cin >> n;
			for (int i = 0; i < n; ++i)
			{
				int v, w;
				cin >> v >> w;
				dis[u][v - 1] = w;
			}
		}

		for (int k = 0; k < N; ++k)
		{
			for (int u = 0; u < N; ++u)
			{
				for (int v = 0; v < N; ++v)
				{
					if (u != v && dis[u][k] >= 0 && dis[k][v] >= 0 && (dis[u][v] < 0 || dis[u][v] > dis[u][k] + dis[k][v]))
					{
						dis[u][v] = dis[u][k] + dis[k][v];
					}
				}
			}
		}

		int minu, mindis = -1;
		for (int u = 0; u < N; ++u)
		{
			int maxdis = 0;
			bool disjoint = false;
			for (int v = 0; v < N; ++v)
			{
				if (dis[u][v] < 0)
				{
					disjoint = true;
					break;
				}
				if (v != u && dis[u][v] > maxdis)
				{
					maxdis = dis[u][v];
				}
			}
			if (disjoint)
			{
				continue;
			}
			if (mindis < 0 || maxdis < mindis)
			{
				minu = u;
				mindis = maxdis;
			}
		}
		if (mindis < 0)
		{
			cout << "disjoint" << endl;
		}
		else
		{
			cout << minu + 1 << " " << mindis << endl;	
		}
	}	
	return 0;  
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值