ZOJ1082 POJ1125 Stockbroker Grapevine,Dijkstra 算法

105 篇文章 0 订阅
13 篇文章 0 订阅

这题是典型的最短路径问题,这里我用的是Dijkstra 算法。Dijkstra 算法的时间复杂度为O(n^2),如果对于每一个点应用Dijkstra 算法,则总体时间复杂度为O(n^3)。


/*******************************************************************************
 * Author : Neo Fung
 * Email : neosfung@gmail.com
 * Last modified : 2011-08-12 22:04
 * Filename : ZOJ1082 POJ1125 Stockbroker Grapevine.cpp
 * Description : 
 * *****************************************************************************/
// ZOJ1082 POJ1125 Stockbroker Grapevine.cpp : Defines the entry point for the console application.
//

// #include "stdafx.h"



#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <math.h>
#include <algorithm>
#include <numeric>
#include <functional>
#include <memory.h>
#include <limits>

using namespace std;

#define INFINITE numeric_limits<int>::max()

int main(void)
{
// 	ifstream cin("data.txt");
	int n;
	int num,dis,len;
	int map[101][101];
	int done[101];	//遍历节点
	int path[101];	//暂时路径长度

	while(cin>>n &&n)
	{
		int minindex,min=INFINITE;

		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=n;++j)
				map[i][j]=INFINITE;
			map[i][i]=0;

			cin>>num;
			for(int j=1;j<=num;++j)
			{
				cin>>dis>>len;
				map[i][dis]=len;
			}
		}

		for(int now=1;now<=n;++now)
		{
			for(int j=1;j<=n;++j)
			{
				path[j]=map[now][j];
			}
			memset(done,0,sizeof(done));
			done[now]=1;

			//对每个节点使用Dijkstra算法
			for(int j=1;j<=n;++j)
			{
				int temp(INFINITE);
				int tmpIndex;
				for(int findmin=1;findmin<=n;findmin++)
				{
					if(!done[findmin] && path[findmin]<temp)
					{
						temp=path[findmin];
						tmpIndex=findmin;
					}
				}
				done[tmpIndex]=1;
				path[tmpIndex];
				for(int update=1;update<=n;++update)
				{
					if(!done[update] && (map[tmpIndex][update]<INFINITE)&&(path[update]>path[tmpIndex]+map[tmpIndex][update]))
					{
						path[update] = path[tmpIndex]+map[tmpIndex][update];
					}
				}
			}

			int temp(0);
			for(int j=1;j<=n;++j)
			{
				if(path[j]>temp)
				{
					temp=path[j];
				}
			}

			if(temp<min)
			{
				min=temp;
				minindex=now;
			}
		}
		if(min<INFINITE)
			cout<<minindex<<' '<<min<<endl;
		else
			cout<<"disjoint"<<endl;
	}


	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值