字符版热浪?
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int MAXN = 200000+5;
int head[MAXN],tot,n,dis[MAXN],nxt[MAXN <<1];
bool vis[MAXN];
bool mp[MAXN];
struct ware
{
char s,e;
int lth;
}a[MAXN];
struct Edge
{
int from,to,cost;
}edge[MAXN<<1];
void build(int f,int t,int d)
{
edge[++tot].from = f;
edge[tot].to = t;
edge[tot].cost = d;
nxt[tot] = head[f];
head[f] = tot;
}
queue <int >q;
void spfa(int s)
{
memset(dis,0x7f,sizeof(dis));
vis[s] = 1;
dis[s] = 0;
q.push(s);
while(!q.empty())
{
int x = q.front();
q.pop();
vis[x] = 0;
for(int i = head[x]; i ; i = nxt[i])
{
Edge e = edge[i];
if(dis[e.to] > dis[x] + e.cost)
{
dis[e.to] = dis[x] + e.cost;
if(!vis[e.to])
{
vis[e.to] = 1;
q.push(e.to);
}
}
}
}
}
int main()
{
char ss;
scanf("%d",&n);
for(int i = 1; i <= n; i ++)
{
cin>>a[i].s>>a[i].e>>a[i].lth;
build(a[i].s-'0',a[i].e-'0',a[i].lth);
build(a[i].e-'0',a[i].s-'0',a[i].lth);
}
int ans = 214748364;
for(int i = 1; i <= n; i ++)
{
if(a[i].s <90 && !mp[a[i].s-'0'])
{
mp[a[i].s-'0'] = 1;
spfa(a[i].s-'0');
if(dis['Z'-'0'] < ans)
{
ans = dis['Z'-'0'];
ss = a[i].s;
}
}
if(a[i].e < 90 && !mp[a[i].e-'0'])
{
mp[a[i].e-'0'] = 1;
spfa(a[i].e-'0');
if(dis['Z'-'0'] < ans)
{
ans = dis['Z'-'0'];
ss = a[i].e;
}
}
}
cout <<ss<<" "<< ans<<endl;
return 0;
}