[POJ 3594] Escort of Dr. Who How [最短路]

本文介绍了一种解决特定时间图中从起点到终点最短路径问题的方法。该问题的特点在于图中的每条边只能在特定的时间段内通过。通过枚举所有可能的出发时间并使用改进的Dijkstra算法来寻找最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

已知一个图,每条边仅在特定的时间可以通过,你可以在某个点停留以等待下一条边可以通过。问从s到t所需要的最少时间。你可以选择一个从s出发的时间。

枚举所有的出发时间,求最短路即可。

#include <cstdio>
#include <queue>

struct HeapNode {
	int i,v;
	HeapNode (int ii,int vv) {
		i=ii;v=vv;
	}
	friend bool operator < (const HeapNode &a,const HeapNode &b) {
		return a.v>b.v;
	}
};
struct Node {
	int fe,v;
};
struct Edge {
	int t,ne,b,e,c;
};

Node a[101];
Edge b[1000];
std::priority_queue<HeapNode> c;
int n,m,s,t,bp;

inline bool update(int &a,int b) {
	if (a==-1||a>b) {
		a=b;
		return true;
	}
	return false;
}
int dij(int stime) {
	while (!c.empty()) c.pop();
	for (int i=1;i<=n;i++) a[i].v=-1;
	a[s].v=stime;
	c.push(HeapNode(s,stime));
	while (!c.empty()) {
		int i=c.top().i,v=c.top().v;
		c.pop();
		if (i==t) return v;
		if (v==a[i].v) {
			for (int j=a[i].fe;~j;j=b[j].ne) {
				int vv=v;
				if (vv<b[j].b) vv=b[j].b;
				vv+=b[j].c;
				if (vv<=b[j].e) {
					if (update(a[b[j].t].v,vv)) {
						c.push(HeapNode(b[j].t,vv));
					}
				}
			}
		}
	}
	return -1;
}

int main() {
	int i,x;
	scanf("%d%d%d%d",&n,&m,&s,&t);
	bp=0;
	for (i=1;i<=n;i++) a[i].fe=-1;
	for (i=0;i<m;i++) {
		scanf("%d%d%d%d%d",&x,&b[bp].t,&b[bp].b,&b[bp].e,&b[bp].c);
		b[bp].ne=a[x].fe;
		a[x].fe=bp++;
	}
	int ans=-1;
	for (i=0;i<=10000;i++) {
		int tmp=dij(i);
		if (tmp!=-1) update(ans,tmp-i);
	}
	if (ans>=0) printf("%d\n",ans);
	else printf("Impossible\n");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值