求A~Z、a~z这52个点,求A~Y到Z的最短距离。
这题就是正常的最短路题,点数也很少。floyd和spfa都能过。
注意:两点间可能有不止一条边。
一开始没注意这一点,wa了一次。。。
floyd:
#include<bits/stdc++.h>
using namespace std;
int d[53][53];
int main()
{
freopen("comehome.in","r",stdin);
freopen("comehome.out","w",stdout);
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=52;++i)
for(int j=1;j<=52;++j)
d[i][j]=100000000;
for(int i=1;i<=52;++i) d[i][i]=0;
for(int i=1;i<=n;++i){
char c1,c2;
int u,v,w;
cin>>c1>>c2>>w;
u=(c1<='Z')?c1-64:c1-70;
v=(c2<='Z')?c2-64:c2-70;
d[u][v]=min(d[u][v],w),d[v][u]=d[u][v];
}
for(int k=1;k<=52;++k)
for(int i=1;i<=52;++i)
for(int j=1;j<=52;++j)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
int ans=100000000-1,ansx;
for(int i=1;i<26;++i)
if(d[i][26]<ans) ans=d[i][26],ansx=i;
cout<<char(ansx+64)<<' '<<ans<<'\n';
}
spfa:
#include<bits/stdc++.h>
#define pii pair<int,int>
#define f first
#define s second
using namespace std;
int d[53][53],a[53];
multiset<pii> q;
bool vis[53];
inline void spfa(){
for(int i=1;i<=52;++i) a[i]=100000000;
q.insert(make_pair(0,26));
a[26]=0;
while(!q.empty()){
pii t=*q.begin();q.erase(q.begin());
if(vis[t.s]) continue;
for(int i=1;i<=52;++i){
if(i!=t.s&&t.f+d[t.s][i]<a[i]){
a[i]=t.f+d[t.s][i];
q.insert(make_pair(a[i],i));
}
}
vis[t.s]=1;
}
int x=100000000-1,y;
for(int i=1;i<26;++i)
if(a[i]<x) x=a[i],y=i;
cout<<char(y+64)<<' '<<x<<'\n';
}
int main()
{
freopen("comehome.in","r",stdin);
freopen("comehome.out","w",stdout);
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=52;++i)
for(int j=1;j<=52;++j)
d[i][j]=100000000;
for(int i=1;i<=52;++i) d[i][i]=0;
for(int i=1;i<=n;++i){
char c1,c2;
int u,v,w;
cin>>c1>>c2>>w;
u=(c1<='Z')?c1-64:c1-70;
v=(c2<='Z')?c2-64:c2-70;
d[u][v]=min(d[u][v],w),d[v][u]=d[u][v];
}
spfa();
}