例题11-11 赛车比赛 单源最短路 spfa
2017-08-09 10:18
253 查看
最短路问题加上了一个条件,处理下开门和关门的时间即可。
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<string>
#include<cstring>
#include<cstdio>
const int maxn=100005;
const int INF=0x3f3f3f3f;
typedef long long LL;
using namespace std;
struct Edge
{
int e,a,b,t; //e是终点
Edge(){}
Edge(int _e,int _a,int _b,int _t):e(_e),a(_a),b(_b),t(_t){}
};
vector<Edge> edges[maxn];
int dist[maxn];
int vis[maxn];
int N,M,S,T;
int spfa()
{
memset(vis,0,sizeof(vis));
memset(dist,INF,sizeof(dist));
queue<int> q;
q.push(S);
dist[S]=0;
vis[S]=1;
while(!q.empty())
{
int s=q.front();q.pop();
vis[s]=0;
for(int i=0;i<edges[s].size();i++)
{
int e=edges[s][i].e;
int a=edges[s][i].a;
int b=edges[s][i].b;
int t=edges[s][i].t;
int now=dist[s]%(a+b); //当前相对于这条路的时间
if(a-now>=t) //如果能通过
{
if(dist[e]>dist[s]+t)
{
dist[e]=dist[s]+t;
if(!vis[e]){vis[e]=1;q.push(e);}
}
}
else //不能通过
{
int tmp=dist[s]+t+(a+b)-now; //(a+b)-now为等待时间,要等一个回合,而当前时间为now,所以等待了(a+b)-now
if(dist[e]>tmp)
{
dist[e]=tmp;
if(!vis[e]){vis[e]=1;q.push(e);}
}
}
}
}
return dist[T];
}
int main()
{
// freopen("E:\\ACM\\test.txt","r",stdin);
int Case=1;
while(cin>>N>>M>>S>>T)
{
for(int i=0;i<maxn;i++) edges[i].clear();
int u,v,a,b,t;
for(int i=0;i<M;i++)
{
cin>>u>>v>>a>>b>>t;
if(a>=t) edges[u].push_back(Edge(v,a,b,t)); //如果打开时间a都小于通过时间t,那么这条路肯定过不了
}
printf("Case %d: %d\n",Case++,spfa());
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<string>
#include<cstring>
#include<cstdio>
const int maxn=100005;
const int INF=0x3f3f3f3f;
typedef long long LL;
using namespace std;
struct Edge
{
int e,a,b,t; //e是终点
Edge(){}
Edge(int _e,int _a,int _b,int _t):e(_e),a(_a),b(_b),t(_t){}
};
vector<Edge> edges[maxn];
int dist[maxn];
int vis[maxn];
int N,M,S,T;
int spfa()
{
memset(vis,0,sizeof(vis));
memset(dist,INF,sizeof(dist));
queue<int> q;
q.push(S);
dist[S]=0;
vis[S]=1;
while(!q.empty())
{
int s=q.front();q.pop();
vis[s]=0;
for(int i=0;i<edges[s].size();i++)
{
int e=edges[s][i].e;
int a=edges[s][i].a;
int b=edges[s][i].b;
int t=edges[s][i].t;
int now=dist[s]%(a+b); //当前相对于这条路的时间
if(a-now>=t) //如果能通过
{
if(dist[e]>dist[s]+t)
{
dist[e]=dist[s]+t;
if(!vis[e]){vis[e]=1;q.push(e);}
}
}
else //不能通过
{
int tmp=dist[s]+t+(a+b)-now; //(a+b)-now为等待时间,要等一个回合,而当前时间为now,所以等待了(a+b)-now
if(dist[e]>tmp)
{
dist[e]=tmp;
if(!vis[e]){vis[e]=1;q.push(e);}
}
}
}
}
return dist[T];
}
int main()
{
// freopen("E:\\ACM\\test.txt","r",stdin);
int Case=1;
while(cin>>N>>M>>S>>T)
{
for(int i=0;i<maxn;i++) edges[i].clear();
int u,v,a,b,t;
for(int i=0;i<M;i++)
{
cin>>u>>v>>a>>b>>t;
if(a>=t) edges[u].push_back(Edge(v,a,b,t)); //如果打开时间a都小于通过时间t,那么这条路肯定过不了
}
printf("Case %d: %d\n",Case++,spfa());
}
return 0;
}
相关文章推荐
- 单源最短路_SPFA_C++
- Aizu 2249Road Construction 单源最短路变形 spfa模板改写
- Aizu 2249 单源最短路变形 spfa模板改写
- 【codeforce Gym 100570B】【最短路SPFA】 ShortestPath Query 【询问单源最短路径,每条边有一个颜色,要求路径上相邻边的颜色不能相同】
- [ACM模板]单源最短路SPFA
- Til the Cows Come Home(最短路(单源SPFA))
- HDU - 2544 - 最短路 (最基础单源最短路问题!!dijkstra+floyd+SPFA)
- ALGO-5 最短路 — 单源最短路 SPFA 算法(java)
- 【OI之路】03图论算法-1最短路之单源最短路(SPFA)
- HDU 1535 Invitation Cards【SPFA最短路】【正反向建边求单源最短路之和】
- poj 1062(spfa 单源最短路)
- 单源最短路模板——SPFA
- UVA 12661 Funny Car Racing 有趣的赛车比赛(最短路,变形)
- HDU 2066 一个人的旅行(单源最短路SPFA)
- POJ 1511 双向单源最短路 SPFA+邻接表
- 洛谷P3371-【模板】单源最短路【SPFA】
- 单源最短路spfa模板(stl更新版)
- hdoj 1535 Invitation Cards 【最短路径SPFA】【正反向建边求单源最短路之和】
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
- 【算法】单源最短路——SPFA