65,206
社区成员
发帖
与我相关
我的任务
分享
for(int u=s,v;u!=t;x=d[u=v],printf("-%c",alpha(v)))
for(v=0;v<52;++v)
if(G[u][v] && forward(x,v)>=d[v])
break;
#include <bits/stdc++.h>
#define MAXN 60
using namespace std;
const long long INF = -1ull/2;
bool vis[MAXN],G[MAXN][MAXN];
long long d[MAXN];
int read()
{
char s[9]; scanf("%s",s);
return isupper(s[0])?(s[0]-'A'):(s[0]-'a'+26);
}
char alpha(int u){
return u<26 ? 'A'+u : 'a'+(u-26);
//还剩多少东西;
}
long long forward(long long x,int v){
return v<26 ? (x-(x+19)/20) : (x-1);
//至少要拿着多少个东西到达节点u,交税后还剩d[u]个东西
}
long long back(int u)
{
if(u>=26) return d[u]+1;
long long x=d[u]*20/19; //初始值
while(forward(x,u)<d[u])
++x; //调整
return x;
}
void Dijkstra(int s,int t,int p)
{
int n=52; //总是有52个节点
memset(vis,0,sizeof(vis));
d[t]=p; vis[t]=1;
for(int i=0;i<n;++i)
if(i!=t)
d[i]=G[i][t]?back(t):INF;
while(!vis[s])
{
int u=-1;
for(int i=0;i<n;++i)
if(!vis[i] && (u<0 || d[i]<d[u]))
u=i;
vis[u]=1;
for(int i=0;i<n;++i)
if(!vis[i] && G[i][u])
d[i]=min(d[i],back(u));
}
return ;
}
int main()
{
freopen("in.txt","r",stdin);
int n,kase=0;
while(scanf("%d",&n)!=EOF && n!=-1 )
{
memset(G,0,sizeof(G));
for(int i=0;i<n;++i)
{
int u=read(),v=read();
if(u!=v)
G[u][v]=G[v][u]=1;
}
int p;
scanf("%d",&p);
int s=read(),t=read();
printf("Case %d:\n",++kase);
Dijkstra(s,t,p);
printf("%lld\n%c",d[s],alpha(s));
long long x=d[s];
for(int u=s,v;u!=t;x=d[u=v],printf("-%c",alpha(v)))
for(v=0;v<52;++v)
if(G[u][v] && forward(x,v)>=d[v])
break;
printf("\n");
}
return 0;
}