Vijos 1082 最短路

来源:互联网 发布:松下fp xh编程手册 编辑:程序博客网 时间:2024/05/06 06:25

点击打开链接

题意:中文

思路:直接跑两遍最短路,然后将所有可以用的边全部找出来,然后在跑一遍最短路求出最短时间即可

#include <queue>#include <vector>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>#include <functional>using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int maxn=5010;const int maxm=40010;struct edge{    int to,cost_ti,cost_len;    edge(int a,int b,int c){to=a;cost_ti=b;cost_len=c;}};typedef pair<int,int>P;vector<edge>G[maxn];int dis1[maxn],dis2[maxn];void dijkstra(int s,int *dis){    priority_queue<P,vector<P>,greater<P> >que;    fill(dis,dis+maxn,inf);    dis[s]=0;que.push(P(0,s));    while(!que.empty()){        P p=que.top();que.pop();        int v=p.second;        if(dis[v]<p.first) continue;        for(unsigned int i=0;i<G[v].size();i++){            edge e=G[v][i];            if(dis[e.to]>dis[v]+e.cost_ti){                dis[e.to]=dis[v]+e.cost_ti;                que.push(P(dis[e.to],e.to));            }        }    }}struct edge1{    int to,cost_len;    edge1(int a,int c){to=a;cost_len=c;}};typedef pair<int,int>P;vector<edge1>GG[maxn];int dis[maxn];void dijkstra1(int s){    priority_queue<P,vector<P>,greater<P> >que;    fill(dis,dis+maxn,inf);    dis[s]=0;que.push(P(0,s));    while(!que.empty()){        P p=que.top();que.pop();        int v=p.second;        if(dis[v]<p.first) continue;        for(unsigned int i=0;i<GG[v].size();i++){            edge1 e=GG[v][i];            if(dis[e.to]>dis[v]+e.cost_len){                dis[e.to]=dis[v]+e.cost_len;                que.push(P(dis[e.to],e.to));            }        }    }}int U[maxm],V[maxm],C[maxm],D[maxm];int main(){    int n,m,st,en,k;    while(scanf("%d%d",&n,&m)!=-1){        for(int i=0;i<maxn;i++) G[i].clear(),GG[i].clear();        for(int i=0;i<m;i++){            scanf("%d%d%d%d",&U[i],&V[i],&C[i],&D[i]);            G[U[i]].push_back(edge(V[i],C[i],D[i]));            G[V[i]].push_back(edge(U[i],C[i],D[i]));        }        scanf("%d%d",&st,&en);        scanf("%d",&k);        dijkstra(st,dis1);dijkstra(en,dis2);        for(int i=0;i<m;i++){            if(dis1[U[i]]+C[i]+dis2[V[i]]<=k||dis1[V[i]]+C[i]+dis2[U[i]]<=k){                GG[U[i]].push_back(edge1(V[i],D[i]));                GG[V[i]].push_back(edge1(U[i],D[i]));            }        }        dijkstra1(st);        if(dis[en]==inf) printf("-1\n");        else printf("%d\n",dis[en]);    }    return 0;}

0 0