USACO/Bessie Come Home

USACO/Bessie Come Home

Posted by dym on March 12, 2014

本文迁移自老博客,原始链接为 https://seven.blog.ustc.edu.cn/usacobessie-come-home/

给定一些点,标号为A-Z、a-z,给定点之间的距离,求从Z到所有其他的大写字母代表的点的最短路径中的最小值。 解法:Dijkstra,注意处理重复边

#include<iostream>
#include<algorithm>
#include<fstream>
#include<stdio.h>
#include<string.h>
using namespace std;
ofstream fout ("comehome.out");
ifstream fin ("comehome.in");
const int INF = 1<<25;
int cnt[55][55];
int dis[55];
bool vis[55];
int n;
void input()
{
	for(int i = 1 ; i <= 52 ;i++){
		for(int j = 1 ; j <= 52 ;j++)
			cnt[i][j] = INF;
	}
	fin>>n;
	char a,b;
	int c , a1, b1;
	for(int i = 0 ;i < n ;i++)
	{
		fin>>a>>b>>c;
		if(isupper(a))
			a1 = a - 'A' + 1;
		else if(islower(a))
			a1 = a - 'a' + 1 + 26;
		if(isupper(b))
			b1 = b - 'A' + 1;
		else if(islower(b))
			b1 = b - 'a' + 1 + 26;
		if(cnt[a1][b1] > c)
			cnt[a1][b1] = cnt[b1][a1]  = c;
	}
	memset(vis , false ,sizeof(vis));
	for(int i = 1 ; i <= 52 ;i++)
		dis[i] = INF;
	dis[26] = 0;
}
void dijstra()
{
	int t = 0;
	while(t++ < 52)
	{
		int Max = INF;
		int pos;
		for(int i = 1 ; i <= 52 ;i++)
		{
			if(!vis[i] && dis[i] <= Max)
			{
				Max = dis[i];
				pos = i;
			}
		}
		vis[pos] = true;
		for(int j = 1 ; j <= 52 ;j++)
		{
			if(dis[pos] + cnt[pos][j] < dis[j])
			{
				dis[j] = dis[pos] + cnt[pos][j];
			}
		}
	}
}
void output()
{
	int Min = INF;
	int pos;
	for(int i = 1 ; i <= 26 ;i++)
	{
		if(i != 26 && dis[i] < Min)
		{
			Min = dis[i];
			pos = i;
		}
	}
	fout<<(char)(pos + 'A' - 1)<<" "<<Min<<endl;
}

int main()
{
	input();
	dijstra();
	output();
}