zoukankan      html  css  js  c++  java
  • 最小花费最短路

    【题目描述】:

    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

    【输入描述】:

    多组数据:每组数据描述如下:

    输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。

    n和m为0时输入结束。

    【输出描述】:

    输出一行有两个数, 最短距离及其花费。

    【样例输入】:

    3 2
    1 2 5 6
    2 3 4 5
    1 3
    0 0

    【样例输出】:

    9 11

    【时间限制、数据范围及描述】:

    时间:1s 空间:128M

    对于 30%的数据:1<n<=100

    对于100%的数据:1<n<=1000; 0<m<100000; s != t; 1<=d,p<=1000

    数据组数<=5,注意卡常;

    分析:

    本题显然是一道最短路,但是注意在最短路的前提下在进行一次贪心,求出最小花费。

    CODE:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cmath>
     4 #include <iostream>
     5 #include <algorithm>
     6 #include <queue>
     7 using namespace std;
     8 const int M=1000005;
     9 const int oo=1<<30;
    10 int n,m,s,t;
    11 int next[M],head[M],to[M],adj[M],val[M];
    12 int dist[M],ans[M];
    13 struct node{
    14     int id,d,v;
    15     bool operator> (const node b) const {return d>b.d;}
    16 }a[M];
    17 priority_queue <node,vector<node>,greater<node> > Q;
    18 int tot;
    19 inline int get(){
    20     char c=getchar();
    21     int res=0;
    22     while (c<'0'||c>'9') c=getchar();
    23     while (c>='0'&&c<='9'){
    24         res=(res<<3)+(res<<1)+c-'0';
    25         c=getchar();
    26     }
    27     return res;
    28 }
    29 void add(int u,int v,int w,int p){
    30     next[++tot]=head[u];
    31     head[u]=tot;
    32     to[tot]=v;
    33     adj[tot]=w;
    34     val[tot]=p;
    35     return;
    36 }
    37 void dijkstra(){
    38     for (int i=1;i<=n;i++) {dist[i]=oo;ans[i]=oo;}
    39     dist[s]=0;
    40     ans[s]=0;
    41     Q.push((node){s,0,0});
    42     while (!Q.empty()){
    43         node x=Q.top(); 
    44         Q.pop();
    45         for (int i=head[x.id];i;i=next[i])
    46             if (x.d+adj[i]<dist[to[i]]||(x.d+adj[i]==dist[to[i]]&&ans[to[i]]>x.v+val[i])){
    47                 dist[to[i]]=x.d+adj[i];
    48                 ans[to[i]]=x.v+val[i];
    49                 Q.push((node){to[i],dist[to[i]],ans[to[i]]});
    50             }
    51     }
    52     return;
    53 }
    54 int main(){
    55     while (1){
    56         n=get(),m=get();
    57         if (n==0&&m==0) break;
    58         memset(head,0,sizeof(head));
    59         for (int i=1;i<=m;i++){
    60             int u,v,w,p;
    61             u=get(),v=get(),w=get(),p=get();
    62             add(u,v,w,p);
    63             add(v,u,w,p);
    64         }
    65         s=get(),t=get();
    66         while (!Q.empty()) Q.pop();
    67         memset(dist,0,sizeof(dist));
    68         memset(ans,0,sizeof(ans));
    69         dijkstra();
    70         cout<<dist[t]<<" "<<ans[t]<<endl;
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    Console
    在IOS10系统中无法定位问题
    c# js 时间
    ConcurrentDictionary,ConcurrentStack,ConcurrentQueue
    转 控件拖动 未验证
    消息处理模拟点击
    C ProcessAsUser
    SessionChange
    installer
    mysql主从同步配置
  • 原文地址:https://www.cnblogs.com/kanchuang/p/11119963.html
Copyright © 2011-2022 走看看