| ||||||||||
| 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 <cstdio>
#include <vector>
#include <algorithm>
#include <deque>
using namespace std;
#define INF 1000000000
#define Max(a, b) ((a > b) ? (a) : (b))
struct EDGE
{
int v;
int st, et, ct;
EDGE(){}
EDGE(int v0, int s0, int e0, int c0):v(v0),st(s0),et(e0),ct(c0){}
};
int n, m, start, end;
vector<EDGE> path[102];
deque<int> Q[2];
int dp[102];
bool init()
{
for (int i = 0; i <= n; i++)
{
path[i].clear();
}
return true;
}
bool Input()
{
int u, v, s, e, c;
scanf("%d %d %d %d", &n, &m, &start, &end);
init();
for (int i = 0 ; i < m; i++)
{
scanf("%d %d %d %d %d",&u, &v, &s, &e, &c);
if (s + c > e)
continue;
path[u].push_back(EDGE(v, s, e, c));
}
return true;
}
bool bfs()
{
int now = 0, u, len;
EDGE edge;
while(!Q[now].empty())
{
Q[1 - now].clear();
while(!Q[now].empty())
{
u = Q[now].front();
Q[now].pop_front();
len = path[u].size();
for (int i = 0 ; i < len; i++)
{
edge = path[u][i];
int ReachTime = Max(dp[u] + edge.ct, edge.st + edge.ct);
if (ReachTime > edge.et)
continue;
if (ReachTime < dp[edge.v])
{
dp[edge.v] = ReachTime;
if (end == edge.v)
continue;
Q[1-now].push_back(edge.v);
}
}
}
now = 1 - now;
}
return true;
}
void clear()
{
Q[0].clear();
Q[1].clear();
for (int i = 0; i <= n; i++)
{
dp[i] = INF;
}
}
bool Run()
{
EDGE edge;
int ans = INF;
int len = path[start].size();
for (int i = 0; i < len; i++)
{
clear();
edge = path[start][i];
dp[edge.v] = edge.st + edge.ct;
Q[0].push_back(edge.v);
bfs();
if (dp[end] != INF)
{
dp[end] -= edge.st;
if (dp[end] < ans)
ans = dp[end];
}
}
if (INF == ans)
printf("Impossible\n");
else
printf("%d\n", ans);
return true;
}
int main()
{
Input();
Run();
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator