路径长度都为1,可以用bfs求最短路 !
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define endl "\n"
const int N=1e6+10;
struct node{
int num,len,sum;
//对operator<进行运算符重载。你想放在堆顶的元素就写在<运算符的右边。
bool operator<(const node &x) const
{
if(len==x.len) return sum<x.sum;
else return len>x.len;
}
};
//也可以在外面进行重载
//bool operator<(node x,node y)
//{
// if(x.len==y.len) return x.sum<y.sum;
// else return x.len>y.len;
//}
//也可以不重载运算符而是写比较函数
//bool cmp(node x, node y)
//{
// if(x.len==y.len) return x.sum<y.sum;
// else return x.len>y.len;
//}
int val[N],vis[N];
vector<int>e[N];
signed main()
{
int n,m,k,p;
cin>>n>>m>>k>>p;
for(int i=1;i<=n;i++) cin>>val[i];
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
e[x].pb(y);
e[y].pb(x);
}
int s,t;
cin>>s>>t;
priority_queue<node>q;
//对应自定义比较函数cmp
//priority_queue<node, vector<node>, function<bool(node, node)>> q(cmp);
if(p==1) q.push({s,1,val[s]});
else q.push({s,1,0});
node tmp;
while(!q.empty()){//bfs
tmp=q.top();
q.pop();
if(vis[tmp.num]) continue;
if(tmp.num==t) break;
vis[tmp.num]=1;
for(auto x:e[tmp.num]){
if(!vis[x]){
node tt;
if((tmp.len+1)%k==p%k)//注意这里的比较:%k之后的结果是0,1,2,...,k-1
tt={x,tmp.len+1,tmp.sum+val[x]};
else
tt={x,tmp.len+1,tmp.sum};
q.push(tt);
}
}
}
cout<<tmp.sum;
return 0;
}