题目连接: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;
}