sicily 1031.Campus

djstra單源最短路徑.

#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <memory.h>
#include <cstring>
using namespace std;

const int MAXN = 1000005;
int road[202][202];
bool used[202];
int minlength[202];
int number;

int djstra(int start,int end)
{
	memset(used,false,sizeof(used));

	for(int i = 0;i <= number;i++)
		minlength[i] = (i == start ? 0 : MAXN);
	used[start] = true;
	for(int i = 0;i <= number;i++)
	{
		int temp_min = MAXN,a = start;
		for(int j = 0;j <= number;j++)
		{
			if(!used[j] && minlength[j] < temp_min)
			{
				temp_min = minlength[j];
				a = j;
			}
		}

		used[a] = true;
		for(int i = 0;i <= number;i++)
		{
			minlength[i] = min(minlength[i],minlength[a] + road[a][i]);//更新從a出發到其他點的距離
		}
	}

	if(used[end])
		return minlength[end];
	else
		return -1;
}

int main()
{
    int n,m;
    cin >> n;
	while(n--)
	{
		cin >> m;
		map<string,int> maps;//實現string和int的映射
		number = 0;
		for(int i = 0; i < 202;i++)
			for(int j = 0;j < 202;j++)
				road[i][j] = ((i == j) ? 0 : MAXN);
		
		string s1,s2;
		for(int i = 0;i < m;i++)
		{
			int length;
			
			cin >> s1 >> s2 >> length;
			if(!maps.count(s1))//沒出現過此點
				maps[s1] = ++number;
			if(!maps.count(s2))
				maps[s2] = ++number;

			road[maps[s1]][maps[s2]] = road[maps[s2]][maps[s1]] = length;

		}

		cin >> s1 >> s2;
		if(s1 == s2)
			cout << 0 << endl;
		else if(!maps.count(s1) || (!maps.count(s1)))//有一條邊不存在
			cout << -1 << endl;
		else
			cout << djstra(maps[s1],maps[s2]) << endl;
			
	}
    return 0;
}                                 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章