UVA - 12661 最短路(SPFA+条件限制)

题目链接
题目大意 裸的最短路,但加了一个限制条件,每条路都会定时开关,两种情况:
1、如果到达一条路的起点时,剩余开放时间不足以通过这条路,则要等着此次先开放完 再等下一次开放才能通过。
2、如果到达一条路的起点时,路处于关闭状态,则要等他开放才能通过
wrong answer原因
1、SPFA算法元素出队后,未维护标记是否在队中的flag数组
2、用动态数组vector存边,由于是多组输入,需要每次先清空利用clear()函数

# include 
# include 
# include 
# include 
# include 
# include 
# include 
using namespace std;
# define MAXN 350
# define MAX 0x3f3f3f3f
# define LL long long
struct node
{
    int e;///路终点
    int time;///花费的时间
    int a, b;///开关相应时间
};
vector<struct node>Q[350];///对每一个城市创建一个动态数组存储从其发出的路
int N, M, Start, End;///城市数目、道路数目、起点、终点
int SPFA()
{
    bool flag[MAXN];///标记是否在队列中
    memset(flag,false,sizeof(flag));
    LL dis[MAXN];///记录起点到其它各点的最短路径
    memset(dis,MAX,sizeof(dis));
    queue<int>P;
    flag[Start]=true;
    dis[Start]=0;
    P.push(Start);
    while(!P.empty())
    {
        int t=P.front();
        P.pop();///队列队顶元素出队
        flag[t]=false;
        for(int i=0; i<(int)Q[t].size(); i++)
        {
            int e=Q[t][i].e;///路终点
            LL add=dis[t];///到达路起点的时间
            LL l=dis[t];///记录走当前道路出发的时间
            l%=(Q[t][i].a+Q[t][i].b);
            if(l>Q[t][i].a)///道路未开放
            {
                add+=Q[t][i].b-(l-Q[t][i].a);
            }
            else if(Q[t][i].a-l///如果当前道路剩余开放时间不足以通过,则要等其下一次开放
                add+=Q[t][i].a-l+Q[t][i].b;
            if(dis[e]>(add+Q[t][i].time))
            {
                dis[e]=add+Q[t][i].time;
                if(!flag[e])
                {
                    flag[e]=true;
                    P.push(e);
                }
            }
        }
    }
    return dis[End];
}
int main()
{
    ios::sync_with_stdio(false);
    int ans=1;
    while(cin>>N>>M>>Start>>End)
    {
        for(int i=1;i<=N;i++)
            Q[i].clear();
        for(int i=1; i<=M; i++)
        {
            int a, b, c, d, e;
            cin>>a>>b>>c>>d>>e;
            if(c>=e)
            {
                struct node A=(node)
                {
                    b,e,c,d
                };
                Q[a].push_back(A);
            }

        }
        LL t=SPFA();
        cout<<"Case "<": "<return 0;
}

你可能感兴趣的:(最短路径)