题意:有n个路口,m条道路,每个路口有一个红绿灯,从路口u能向v走当且仅当这两个路口的灯的颜色相同,给出每个路口最开始的红绿灯的颜色,剩余变色时间,两种颜色转换的时间,问s到t的最短路。
思路:很显然是个最短路问题,对于红绿灯的问题,只要在到u的时候算一下到v需要等多长时间就行了。由于晚到一个路口不会比早到更优,那么直接存到u的最短时间就行了。计算需要等的时间的时候要注意最开始有个初始时间,然后还有可能要等1~2轮才能走,如果2轮以后还是不能走,那么就永远不能从u到v了(此时两个灯颜色不同且变色时间相同)。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=300+10;
const int maxm=14000+10;
struct Node
{
int c,r;
int t[2];
};
Node node[maxn];
struct Edge
{
int v,next;
int w;
};