P1266 速度限制(spfa)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1266 速度限制(spfa)相关的知识,希望对你有一定的参考价值。

P1266 速度限制(spfa)

最短路多一个速度限制,因为N和V都范围较小,那就二维状态进行转移。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=155,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n)
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 

template <typename T>		//x=max(x,y)  x=min(x,y)
void cmx(T &x,T y)
	if(x<y) x=y;

template <typename T>
void cmn(T &x,T y)
	if(x>y) x=y;

int n,m,D;
int h[N],cnt;
db d[N][505];
struct edge
	int to,nt,V,w;
e[M<<1];
void add(int u,int v,int V,int w)
	e[++cnt]=v,h[u],V,w,h[u]=cnt;

bool vis[N][505];
PII pre[N][505];
void print(int u,int V)
	if(~pre[u][V].x) 
	print(pre[u][V].x,pre[u][V].y);
	printf("%d ",u);

void spfa(int st)
	for(int i=0;i<n;i++)
		for(int j=0;j<=500;j++) pre[i][j] = -1,-1;
	queue<PII>q;mst(d,127),d[st][70]=0,vis[st][70]=1;q.push(st,70);
	//printf("%f\\n",d[st][0]);
	while(!q.empty())
		int u=q.front().x;
		int V=q.front().y;
		//printf("(%d,%d) %f\\n",u,V,d[u][V]);
		q.pop();vis[u][V]=0;
		for(int i=h[u];i;i=e[i].nt)
			int v=e[i].to,vv = e[i].V,w=e[i].w;
			if(!vv) vv=V;
			if(d[v][vv]>d[u][V]+(double)(e[i].w/(vv*1.0)))
				d[v][vv]=d[u][V]+(double)(e[i].w/(vv*1.0));
				pre[v][vv] = u,V;
				if(!vis[v][vv]) q.push(v,vv),vis[v][vv]=1;
			
		
	
	db mn = 1e9;
	int id = -1;
	rep(i,1,500)
		if(mn>d[D][i])
			mn = d[D][i];
			id = i;
		
	//printf("id=%d,D=%d\\n",id,D);
	print(D,id);

int main()
	//mst(h,-1);
	scanf("%d%d%d",&n,&m,&D);
	rep(i,1,m)
		int u,v,V,w;
		scanf("%d%d%d%d",&u,&v,&V,&w);
		add(u,v,V,w);
	
	spfa(0);
	return 0;


以上是关于P1266 速度限制(spfa)的主要内容,如果未能解决你的问题,请参考以下文章

P1266 速度限制

洛谷 P1266 速度限制

[luoguP1266] 速度限制(spfa)

POJ1062 昂贵的聘礼(带限制的spfa)

第一发SPFA(热浪)

codevs 1021 玛丽卡 SPFA