参考别人的代码,真的是写的非常漂亮。
#include <bits/stdc++.h>
using namespace std;
#define maxn 100010
const int inf=0x3f3f3f3f;
int S[110],V[110];
int dis[maxn];//记录花费
int pre[maxn];//和nun数组模拟链表
int num[maxn];
int p; int u,v;
struct node{
int s,v;
bool operator <(const node & x)const{
return x.v<v;
}
};
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
void print(int x)
{
if(pre[x]==-1){
cout<<u;
return;
}
print(pre[x]);
cout<<num[x];
//return;
}
int bfs(int so)
{
memset(dis,inf,sizeof(dis));
dis[so]=0;
pre[so]=-1;//相当于头指针
//cout<<dis[3]<<endl;
priority_queue<node>qu;
qu.push({so,0});
while(!qu.empty()){
node temp=qu.top();
qu.pop();
if((temp.s*10+v)%p==0){
print(temp.s);
cout<<v;
return 1;
}
for(int i=0;i<10;i++){
if(V[i]){
int ss=(temp.s*10+i)%p;
if(dis[ss]>dis[temp.s]+V[i]){
dis[ss]=dis[temp.s]+V[i];
pre[ss]=temp.s;//指向前一个
num[ss]=i;//记录数据
qu.push({ss,dis[ss]});
}
}
}
}
return 0;
}
int main()
{
int a,b,n;
scanf("%d%d%d",&a,&b,&n);
p=gcd(a,b);
//cout<<p<<endl;
for(int i=1;i<=n;i++)scanf("%d",&S[i]);
for(int i=1;i<=n;i++)scanf("%d",&V[S[i]]);
scanf("%d%d",&u,&v);
if(bfs(u)==0)cout<<-1<<endl;
return 0;
}