Funny Car Racing UVA - 12661
题目链接:https://cn.vjudge.net/problem/UVA-12661
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
#define N 350
long long int SPFA();
struct info
{
int to;
int a;
int b;
int c;
}tmp;
vector <info> Map[N];
bool vis[N];
long long int dis[N];
int n, m, s, t;
int main()
{
int kase = 0;
while(cin >> n >> m >> s >> t)
{
int u, v, a, b, c;
for(int i = 0; i < m; i++)
{
scanf("%d%d%d%d%d", &u, &v, &a, &b, &c);
if(c > a);
else
{
tmp.a = a;
tmp.b = b;
tmp.c = c;
tmp.to = v;
Map[u].push_back(tmp);
}
}
printf("Case %d: %lld\n", ++kase, SPFA());
for(int i = 0; i <= n; i++)
{
Map[i].clear();
}
}
return 0;
}
long long int SPFA()
{
memset(dis, INF, sizeof(dis));
memset(vis, false, sizeof(vis));
vis[s] = true;
queue <int> q;
q.push(s);
dis[s] = 0;
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
int End = Map[u].size();
for(int i = 0; i < End; i++)
{
int to = Map[u][i].to;
int x;
x = dis[u] % (Map[u][i].a + Map[u][i].b);
int add = 0;
if(x <= Map[u][i].a - Map[u][i].c)
{
add = Map[u][i].c;
}
else
{
add = Map[u][i].b + Map[u][i].a - x + Map[u][i].c;
}
if(dis[to] > dis[u] + add)
{
dis[to] = dis[u] + add;
if(!vis[to])
{
vis[to] = true;
q.push(to);
}
}
}
}
return dis[t];
}