3.H - Funny Car Racing

题目连接:http://acm.hust.edu.cn/vjudge/contest/123674#problem/H

题目大意是 有n个路口,m条路,每条路都是周期性的开放和关闭,而且车必须要在路关闭之前离开这条路,求从一个路口到另一个路口所需要的

最短时间。就是用dijkstra 算法,不过更新时间的时候要考虑等待的时间。

#include<vector>
#include<cmath>
#include<queue>
#include<string>
#define maxx 100000000
using namespace std;
struct node {int t;int a;int b;int w;};
vector<node>g[1002];
bool vis[1002];
int d[1002],n;
queue<int>q;
int spfa(int s,int ans)
{
    memset(vis,false,sizeof(vis));
    q.push(s);
    vis[s]=true;
    for(int i=0;i<=n;i++)
     d[i]=maxx;
     d[s]=0;
     while(!q.empty())
     {
         int u;
         u=q.front();
         q.pop();
         vis[u]=false;
         for(int i=0;i<g[u].size();i++)
         {
             int v,time;
             v=g[u][i].t;time=g[u][i].w;
             int t=d[u]%(g[u][i].a+g[u][i].b);
             int temp=0;
             if(t<=g[u][i].a)
             {
                 int tt;
                 tt=t+time;
                 if(tt<=g[u][i].a)
                 temp=0;
                 else
                 temp=g[u][i].a+g[u][i].b-t;
             }
         else
         {
             temp=g[u][i].a+g[u][i].b-t;
         }
         if(d[u]+temp+time<d[v])
         {
             d[v]=d[u]+temp+time;
             if(!vis[v])
             {
                 q.push(v);
                 vis[v]=true;
             }
         }
     }
  }
  return d[ans];
}
int main()
{
    int m,s,t,e,w,a,b,p=1,start,final1;
    while(scanf("%d %d %d %d",&n,&m,&start,&final1)>0)
    {
        for(int i=0;i<=n;i++)
            g[i].clear();
        for(int i=0;i<m;i++)
        {
            scanf("%d %d",&a,&b);
            scanf("%d %d %d",&s,&e,&w);
            if(s<w)//open的时间小于他要通过需要的时间,永远都无法通过
            continue;
            node  temp;
            temp.t=b;temp.a=s;temp.b=e;temp.w=w;
            g[a].push_back(temp);
        }
        printf("Case %d: %d\n",p++,spfa(start,final1));
    }
    return 0;
}

 

posted @ 2016-07-29 19:13  Twsc  阅读(206)  评论(0)    收藏  举报