蒟蒻初学同余最短路,dijkstra求调
查看原帖
蒟蒻初学同余最短路,dijkstra求调
760883
Yoimiyamwf楼主2023/10/6 10:40

rt,后来重写了一个spfa过了,但这个dijkstra为什么不对...

#include <bits/stdc++.h>
#define in inline
#define rint register int
#define r(a) runtimerror(a)
#define w(a) wronganswer(a)
#define wl(a) wronganswer(a);putchar('\n')
#define ws(a) wronganswer(a);putchar(' ')
using namespace std;
typedef long long ll;
int tot,head[100010];
ll x,y,z,ans,h,cost[100010];
bool vis[100010];
template <typename t> void wronganswer(t a){
	if(a<0) putchar('-'),a=-a;
	if(a>9) wronganswer(a/10);
	putchar(a%10^48);
}
template <typename t> in void runtimerror(t &a){
	char ch=getchar();
	t x=1,f=0;
	while(!isdigit(ch)){
		if(ch=='-') x=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		f=(f<<3)+(f<<1)+(ch^48);
		ch=getchar();
	}
	a=x*f;
}
struct Edge{
	int to,nex,cost;
}edge[200010];
in void add_edge(int from,int to,int cost){
	edge[++tot]={to,head[from],cost};
	head[from]=tot;
}
in void dijkstra(){
	q.push({1,1});
	memset(cost,0x3f,sizeof(cost));
	cost[1]=1;
	while(!q.empty()){
		a=q.top();
		q.pop();
		if(vis[a.id]) continue;
		vis[a.id]=true;
		for(rint i=head[a.id];i;i=edge[i].nex){
			if(cost[edge[i].to]>a.cost+edge[i].cost){
				cost[edge[i].to]=a.cost+edge[i].cost;
				q.push({edge[i].to,cost[edge[i].to]});
			}
		}
	}
}
int main(){
	r(h),r(x),r(y),r(z);
	if(x==1||y==1||z==1){
		w(h);
		return 0;
	}
	for(rint i=0;i<x;i++){
		add_edge(i,(i+y)%x,y);
		add_edge(i,(i+z)%x,z);
	}
	dijkstra();
	for(rint i=0;i<x;i++){
		if(h>=cost[i]) ans+=(h-cost[i])/x+1;
	}
	w(ans);
	return 0;
}
2023/10/6 10:40
加载中...