| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴一皮代码#include <queue>
#include <cstdio>
#include <bitset>
#include <cstring>
using namespace std;
inline int read()
{
int x=0,f=1;char c=getchar();
while (c<'0' || c>'9'){if (c=='-')f=-1;c=getchar();}
while (c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();}
return x*f;
}
const int MAXN=105;
const int MAXM=2005;
const int INF=0x3f3f3f3f;
int n,m,s,t,id,MIN,MAX;
struct dij
{
int dot,w;
dij(int dot,int w):dot(dot),w(w){}
bool operator < (const dij tmp) const
{
return w>tmp.w;
}
};
struct edge
{
int v,w,l,r,nx;
}set[MAXM];
int head[MAXN],dis[MAXN];
bitset<MAXN> vis;
priority_queue<dij> Q;
inline void Addedge(int u,int v,int l,int r,int w)
{
id++;set[id].v=v;set[id].w=w;set[id].l=l;set[id].r=r;set[id].nx=head[u];
head[u]=id;
}
inline void init()
{
int u,v,l,r,w;
memset(head,-1,sizeof(head));
n=read();m=read();s=read();t=read();
for (int i=1;i<=m;i++)
{
u=read();v=read();l=read();r=read();w=read();
if (r-l<w)continue;
MIN=min(l,MIN);MAX=max(r,MAX);
Addedge(u,v,l,r,w);
}
}
inline int dijksta(int st)
{
vis.reset();
for (int i=1;i<=n;i++)dis[i]=INF+st;
Q.push(dij(s,st));dis[s]=st;
int u,v,w;vis.set(s);
while (!Q.empty())
{
u=Q.top().dot;Q.pop();
for (int k=head[u];k>0;k=set[k].nx)
{
v=set[k].v;
w=max(dis[u],set[k].l);
if (w+set[k].w>set[k].r)continue;
if (w+set[k].w<dis[v])
{
dis[v]=w+set[k].w;
if (!vis[v])
{
vis.set(v);
Q.push(dij(v,dis[v]));
}
}
}
}
return dis[t]-st;
}
int main()
{
init();
int ans=INF;
for (int i=MIN;i<=MAX;i++) ans=min(ans,dijksta(i));
if (ans==INF)puts("Impossible");
else printf("%d\n",ans);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator