已知一个图,每条边仅在特定的时间可以通过,你可以在某个点停留以等待下一条边可以通过。问从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;
}