Dijstra38pts求调
查看原帖
Dijstra38pts求调
338144
tkth楼主2023/8/7 09:28
#include <iostream>
#include <cstring>
#include <queue>
#define ll long long
using namespace std;
const int Max = 4e4+10;
const int Max2=2e4+10;
int n,m,ans=0x3f3f3f3f;int s,t;
int Ver[Max],Head[Max],Next[Max],Edge[Max],tot;
int d[101][Max2];
bool v[101][Max2];
void add(int x,int y,int z){
	Edge[++tot]=z;Ver[tot]=y;Next[tot]=Head[x];Head[x]=tot;	
}
struct node{
	int l,kk,id;
	bool operator < (const node &A)const{
		return l>A.l;
	}
};
priority_queue<node>q;
void dij(int ss){
	memset(d,0x3f,sizeof d);
	memset(v,0,sizeof v);
	d[0][ss]=0;
	q.push(node{0,0,ss});
	while(!q.empty()){
		int x=q.top().id,k=q.top().kk;q.pop();
		if(k>100){
			ans=min(ans,d[k][x]);
		}
		else{
			if(!v[k][x]){
				v[k][x]=1;
				for(int i = Head[x];i;i=Next[i]){
					int y=Ver[i],w=Edge[i];
					if(d[k+1][y]>d[k][x]+w/(k+1)){
						d[k+1][y]=d[k][x]+w/(k+1);
						q.push(node{d[k+1][y],(k+1),y});	
					}
				}
			}	
		}
	}
}
int main(){
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for(int i = 1;i <= m;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	dij(t);
	for(int i = 0;i <= 100;i++){
		ans=min(ans,d[i][s]);
		//cout << d[i][s] << " ";
	}
	printf("%d",ans);
	return 0;
}

测评记录

2023/8/7 09:28
加载中...