社区讨论

蒟蒻初学同余最短路,dijkstra求调

P3403跳楼机参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo15yacl
此快照首次捕获于
2023/10/22 15:44
2 年前
此快照最后确认于
2023/11/02 15:19
2 年前
查看原帖
rt,后来重写了一个spfa过了,但这个dijkstra为什么不对...
CPP
#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;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...