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; }