uva12661 Dijkstra
2015-08-02 15:57
405 查看
注意有的路可能出现,通过时间>打开时间。有重边,需要使用邻接表。
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<string> #include<map> #include<set> #include<algorithm> #include<vector> #include<stack> #include<queue> #include<sstream> #define LL long long #define OJ_PRINT 0 #define READ_FILE 1 using namespace std; const int NN_MAX = 310; const int MM_MAX = 60000; const int INF = 0x0fffffff; struct Edge{ int from,to,open,close,spend; Edge (int a1=0,int b1=0,int c1=0,int d1=0,int e1=0):from(a1),to(b1),open(c1),close(d1),spend(e1){} }theEdge[MM_MAX]; /**********************************************************/ int n,m,s,t,lenEdge; vector<int>G[NN_MAX]; int d[NN_MAX],vis[NN_MAX]; /**********************************************************/ int min_2 (int x,int y) {return x<y?x:y;} int max_2 (int x,int y) {return x>y?x:y;} void dijkstra (); /**********************************************************/ int main() { if (READ_FILE) freopen ("in.txt","r",stdin); int tt=1; while (scanf ("%d %d %d %d",&n,&m,&s,&t)!=EOF) { for (int i=0;i<=n;i++) G[i].clear (); int a1,a2,a3,a4,a5; lenEdge=0; for (int i=0;i<m;i++){ scanf ("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5); theEdge[lenEdge++]=Edge (a1,a2,a3,a4,a5);G[a1].push_back(lenEdge-1); } dijkstra (); printf ("Case %d: %d\n",tt++,d[t]); } return 0; } void dijkstra () { memset (vis,0,sizeof (vis)); for (int i=0;i<=n;i++) d[i]=INF; d[s]=0; for (int l=0;l<n;l++){ int x,mm=INF; for (int y=1;y<=n;y++) if (!vis[y] && d[y]<mm) mm=d[x=y]; vis[x]=1; for (int i=0;i<G[x].size ();i++){ Edge e=theEdge[G[x][i]]; if (e.spend>e.open) continue; int tmp=d[x]%(e.open+e.close); if (tmp<e.open && tmp+e.spend<=e.open)//路开着,且能马上穿过 d[e.to]=min_2 (d[e.to],d[x]+e.spend); else d[e.to]=min_2 (d[e.to],d[x]+e.open+e.close+e.spend-tmp); } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息
- C++中拷贝构造函数的应用详解