题目连接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1333
题意:给你一个n个顶点,m条边(每条边都有三个参数,开放时间,关闭时间,和通过这条边的时间)的有向图;
要你求从s 到 t 的最短路;dijkstra算法可解;
坑点:我用的是队列优化+Vector存储每条边; 在每次调用dijkstra后,必须初始化邻接表,在这个地方坑了好久,这是第二次了,以后记住 如果用vector就要初始化~
附上代码:
#include <iostream> #include <stdio.h> #include <string> #include <string.h> #include <vector> #include <queue> const int INF=999999999; using namespace std; typedef pair<int ,int > P; int n,m,s,t; struct edge { int to; int open; int close; int cost; }; vector<edge>G[330]; int d[330]; void init() { for(int i=0;i<330;i++)G[i].clear(); } void dijkstra() { priority_queue<P,vector<P>,greater<P> >que; for(int i=0;i<320;i++)d[i]=INF; d[s]=0; que.push(P(0,s)); while(!que.empty()) { P p=que.top(); que.pop(); int v=p.second; if(d[v]<p.first)continue; for(int i=0;i<G[v].size();i++) { edge e=G[v][i]; int tmp=p.first,mod=e.open+e.close; int re=tmp%mod; if(re<e.open&&e.open-re>=e.cost) { if(d[e.to]>tmp+e.cost) { d[e.to]=tmp+e.cost; que.push(P(d[e.to],e.to)); } } else if(e.open>=e.cost) { if(d[e.to]>tmp+e.cost+mod-re) { d[e.to]=tmp+e.cost+mod-re; que.push(P(d[e.to],e.to)); } } } } } int main() { int test=1; while(scanf("%d%d%d%d",&n,&m,&s,&t)!=EOF) { for(int i=0;i<m;i++) { int u,v,a,b,t1; scanf("%d%d%d%d%d",&u,&v,&a,&b,&t1); edge e; e.to=v; e.open=a; e.close=b; e.cost=t1; G[u].push_back(e); } dijkstra(); init(); printf("Case %d: %d\n",test++,d[t]); } return 0; }
时间: 2024-10-12 08:24:29