usaco 2.4.4 Bessie Come Home
2017年6月11日
Floyd算法
两个农场之间可能有多个道路并且权不相同,所以输入数据时应选择最小的权当作这两个农场之间的距离。
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
int P;
//用1-26代替a-z,用27-52代替A-Z;
int Dis[70][70];
inline void Debugs()//调试函数
{
for(int i = 27; i <= 51; i++)
cout << char(i - 27 + int('A')) << "-----" << Dis[i][52] << endl;
}
inline int ChangeTo(char s)
{
if(s >= 'A' && s <= 'Z')
return int(s) - int('A') + 27;
if(s >= 'a' && s <= 'z')
return int(s) - int('a') + 1;
}
void Putin()
{
cin >> P;
memset(Dis, 10, sizeof(Dis));
char a, b; int c;
for(int i = 1; i <= P; i++){
cin >> a >> b >> c;
int x = ChangeTo(a); int y = ChangeTo(b);
Dis[x][y] = Dis[y][x] = min(c, Dis[x][y]);
}
}
void Floyd()
{
for(int k = 1; k <= 52; k++)
for(int i = 1; i <= 52; i++)
for(int j = 1; j <= 52; j++)
Dis[i][j] = min(
Dis[i][j], (Dis[i][k] + Dis[k][j])
);
}
void FindPrf()
{
int num; int min_dis = 99999999;
for(int i = 27; i <= 51; i++)
if(min_dis > Dis[i][52]){
min_dis = Dis[i][52];
num = i;
}
cout << char(num + int('A') - 27) << ' ' << min_dis <<endl;
}
int main()
{
Putin();
Floyd();
//Debugs();
FindPrf();
return 0;
}