1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#include <bits/stdc++.h>
//#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
using ll = long long;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int N = 0;
const int M = 20001;//双向建边注意要乘二
int t;
int cnt = 0;
int head[257];
bool vis[257];
ll dis[257];
struct Edge
{
int next,to,w;
}edge[M];
void add(int u,int v,int w)
{
cnt++;
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
void init()
{
for(int i=1;i<=256;i++)
{
dis[i] = INF;
}
memset(vis,false,sizeof(vis));
}
priority_queue<pii,vector<pii>,greater<pii>> q;
void dijkstra(int start)
{
dis[start] = 0;
q.push({0,start});
while(!q.empty())
{
int minnum = q.top().second;
q.pop();
if(vis[minnum]) continue;
vis[minnum] = true;
for(int i=head[minnum];i;i=edge[i].next)
{
int v = edge[i].to;
int w = edge[i].w;
if(dis[v]>dis[minnum]+w)
{
dis[v] = dis[minnum] + w;
q.push({dis[v],v});
}
}
}
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int m;
cin >> m;
vector<pair<char,int>> cattle;
int end = 'Z';
for(int i=1;i<=m;i++)
{
char a,b;
cin >> a >> b;
int A = a;
int B = b;
int w;
cin >> w;
add(A,B,w);
add(B,A,w);
//如果是大写字符则压入起点数组
if(isupper(a)&&a!='Z') cattle.push_back({a,A});
if(isupper(b)&&b!='Z') cattle.push_back({b,B});
}
vector<pair<char,int>> ans;
//遍历起点数组,将所有起点跑一遍最短路
for(pair<char,int> x : cattle)
{
int start = x.second;
char label = x.first;
init();//注意每跑完一次迪杰斯特拉就要重新初始化Vis和Dis数组
dijkstra(start);
ans.push_back({label,dis[end]});
}
pair<char,int> answer = {'0',10000000};
for(pair<char,int> x : ans)//在所有最短路中找出最短的路并记录
{
if(x.second < answer.second)
{
answer.second = x.second;
answer.first = x.first;
}
}
cout << answer.first << ' ' << answer.second;
return 0;
}
|