ZOJ1592 POJ2263 Heavy Cargo,Dijkstra算法

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

这题没有什么好说的,知道起点和终点,直接用Dijkstra,一次AC。



/*******************************************************************************
 # Author : Neo Fung
 # Email : neosfung@gmail.com
 # Last modified: 2011-08-18 15:06
 # Filename: ZOJ1592 POJ2263 Heavy Cargo.cpp
 # Description : 
 ******************************************************************************/
// ZOJ1592 POJ2263 Heavy Cargo.cpp : Defines the entry point for the console application.
//

// #include "stdafx.h"



#include <stdio.h>
#include <iostream>
#include <string>
#include <map>
#include <functional>
#include <memory.h>

using namespace std;

#define INF 0

int main(void)
{
	int scenario=1;
	int n,r;
	map<string,int> mymap;
	int matrix[202][202];
	int path[202];
	int visit[202];
	string start,end;
	int len;

	while(cin>>n>>r &&n&&r)
	{
		mymap.clear();
		memset(path,0,sizeof(path));
		memset(visit,0,sizeof(visit));
		int index(0);

		for(int i=0;i<n;++i)
		{
			for(int j=0;j<n;++j)
			{
				matrix[i][j]=INF;
			}
			matrix[i][i]=10000;
		}

		for(int i=0;i<r;++i)
		{
			cin>>start>>end>>len;
			if(mymap.find(start)==mymap.end())
			{
				mymap.insert( make_pair(start,index++));
			}
			if(mymap.find(end)==mymap.end())
			{
				mymap.insert( make_pair(end,index++));
			}
			matrix[mymap[start]][mymap[end]]=len;
			matrix[mymap[end]][mymap[start]]=len;
		}
		cin>>start>>end;
		int a=mymap[start],b=mymap[end];

		for(int i=0;i<n;++i)
		{
			path[i]=matrix[a][i];
		}
		visit[a]=1;

		for(int i=0;i<n;++i)
		{
			int minimum(INF);
			int index(i);

			for(int j=0;j<n;++j)
				if(!visit[j] && minimum<path[j] && path[j]> INF)
				{
					minimum=path[j];
					index=j;
				}
			visit[index]=1;

			for(int j=0;j<n;++j)
				if(!visit[j] && (matrix[index][j]>INF) && (path[j]<min(matrix[index][j],path[index])))
					path[j]=min(matrix[index][j],path[index]);
		}
			printf("Scenario #%d\n%d tons\n\n",scenario++,path[b]);

	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值