缺少关键数据范围
查看原帖
缺少关键数据范围
250699
mot1ve楼主2020/11/26 16:51

x,y,b,e,c中b,e的数据范围很关键,直接决定了spfa要跑多少次,一开始跑了1000次发现不行。虽然题解都千篇一律写的取b的max所以没有问题。

//变形spfa
//有时间限制,在spfa更新的时候需要确保dis[u]+edge[i].w<=edge[i].t; 才能更新
//如果max(dis[u],edge[i].s)+edge[i].w<dis[v]//可以更新
//枚举起始时间,1--mx;
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,s,t,T,ans=1e9,idx;
struct node{
	int nxt,to,w,s,t;
}edge[10010];
int head[1010],vis[1010],dis[1010];
void add(int u,int v,int s,int t,int w)
{
	edge[++idx].nxt=head[u];
	edge[idx].to=v;
	edge[idx].s=s;
	edge[idx].t=t;
	edge[idx].w=w;
	head[u]=idx;
}
void spfa(int T)
{
	for(int i=1;i<=n;i++)
	{
		dis[i]=1e9;
	}
	memset(vis,0,sizeof(vis));
	queue<int> q;
	q.push(s);
	vis[s]=1;
	dis[s]=T;
	while(q.size())
	{
		int x=q.front();
		q.pop();
		vis[x]=0;
		if(x==t)
		ans=min(ans,dis[t]-T);
		for(int i=head[x];i;i=edge[i].nxt)
		{
			int v=edge[i].to;
			if(dis[x]+edge[i].w<=edge[i].t&&max(dis[x],edge[i].s)+edge[i].w<dis[v])
			{
				dis[v]=max(dis[x],edge[i].s)+edge[i].w;
				if(!vis[v])
				{
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
}
signed main()
{
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++)
	{
		int u,v,ss,tt,w;
		cin>>u>>v>>ss>>tt>>w;
		if(ss+w<=tt)
		add(u,v,ss,tt,w);
	}
	for(int i=1;i<=10010;i++)
	{
		spfa(i);
	}
	if(ans==1e9)
	cout<<"Impossible";
	else cout<<ans;
	return 0;
}
2020/11/26 16:51
加载中...