#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
struct e{
int data;
int b,h,c;
e *next;
};
e edge[101];
int n,m;
int start,end;
int d[10001][101];
struct node{
int time;
int weight;
int data;
friend bool operator <(node a,node b){
return a.weight>b.weight;
}
};
int v[10001][101];
void solve(){
int i,j,k;
priority_queue<node> q;
for(i=0;i<=10000;i++)
for(j=1;j<=n;j++)
d[i][j]=1000000000;
e *p=edge[start].next;
node a;
while(p)
{
for(i=p->b;i<=p->h-p->c;i++)
{
d[i][p->data]=i+p->c;
a.time=i;
a.weight=i+p->c;
a.data=p->data;
q.push(a);
}
p=p->next;
}
int ans=-1;
while(!q.empty())
{
a=q.top();
q.pop();
if(a.data==end)
{
if(ans==-1) ans=a.weight-a.time;
else
ans=min(ans,a.weight-a.time);
continue;
}
if(v[a.time][a.data]) continue;
v[a.time][a.data]=1;
e *p=edge[a.data].next;
i=a.time;
while(p)
{
if(a.weight+p->c<=p->h&&d[i][p->data]>max(a.weight,p->b)+p->c)
{
d[i][p->data]=max(a.weight,p->b)+p->c;
node b;
b.data=p->data;
b.time=i;
b.weight=d[i][p->data];
q.push(b);
}
p=p->next;
}
}
if(ans==-1) cout<<"Impossible"<<endl;
else
cout<<ans<<endl;
}
void add(int s,int t,int b,int h,int c){
e *p = new e;
p->b=b;
p->h=h;
p->c=c;
p->data=t;
p->next=edge[s].next;
edge[s].next=p;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t,w;
cin>>n>>m>>start>>end;
for(i=1;i<=m;i++)
{
cin>>s>>t>>j>>k>>w;
if(k-j>=w)
add(s,t,j,k,w);
}
solve();
}
int main(){
read();
return 0;
}
转载于:https://www.cnblogs.com/zhaozhe/archive/2011/05/29/2061922.html