cjweffort

博客园 首页 联系 订阅 管理

use dijkstral algorithm to find the shortest path whose cost is always minimum.(dynamic array version)

// 1030. Travel Plan.cpp: 主项目文件。

#include "stdafx.h"
#include <cstdio>
#include <cstring>
#include <vector>
using std::vector;

const int INF=0x6fffffff;
const int N=503;
typedef struct Edge{
	int to,dd,cc;
	Edge(int _to,int _dist,int 

_cost):to(_to),dd(_dist),cc(_cost){}
}Edge;
vector<Edge> edge[N];
vector<int> path[N];
int dist[N],cost[N];
bool used[N];
int citys,roads,start,finish;

int findMin(){
	int minf=-1,min=INF;
	for(int i=0;i<citys;i++){
		if(!used[i]&&dist[i]

<min)
			min=dist

[i],minf=i;
	}
	return minf;
}

void dijkstral(){
	memset(used,0,sizeof(used));
	for(int i=0;i<citys;i++)
		dist[i]=INF;
	dist[start]=0;
	path[start].push_back(start);
	for(int i=0;i<citys;i++){
		int minIndex=findMin();
		if(minIndex==-1)
			return;
		if(minIndex==finish)
			return;
		used[minIndex]=true;
		typedef 

vector<Edge>::iterator Itr;
		for(Itr ite=edge

[minIndex].begin();ite!=edge

[minIndex].end();ite++){
			if(!used[ite-

>to]){
				int 

distTemp=dist[minIndex]+ite-

>dd,costTemp=cost[minIndex]+ite->cc;
				if

(distTemp<dist[ite->to]){
					

dist[ite->to]=distTemp;
					

cost[ite->to]=costTemp;
					

path[ite->to]=path[minIndex];
					

path[ite->to].push_back(ite->to);
				}
				else 

if(distTemp==dist[ite->to]){
					

if(costTemp<cost[ite->to]){
					

	cost[ite->to]=costTemp;
					

	path[ite->to]=path[minIndex];
					

	path[ite->to].push_back(ite-

>to);
					

}
				}
			}		
		}
	}
}

int main()
{
    scanf("%d%d%d

%d",&citys,&roads,&start,&finish);
	for(int i=0;i<roads;i++){
		int ff,tt,dd,cc;
		scanf("%d%d%d

%d",&ff,&tt,&dd,&cc);
		Edge edge1

(tt,dd,cc),edge2(ff,dd,cc);
		edge[ff].push_back

(edge1);
		edge[tt].push_back

(edge2);
	}
	dijkstral();
	for(vector<int>::iterator 

ite=path[finish].begin();ite!=path

[finish].end();ite++)
		printf("%d ",*ite);
	printf("%d %d\n",dist

[finish],cost[finish]);
    return 0;
}


posted on 2013-03-13 22:14  cjweffort  阅读(130)  评论(0编辑  收藏  举报