战利品分配(bfs与优先队列的运算符重载)

 

路径长度都为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;
}

猜你喜欢

转载自blog.csdn.net/weixin_61725823/article/details/129327477