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

    好像不早了啊这个时间。。。唉反正没事干,还要跟人聊天,正好还欠那么多,能写一些就写一些吧嘤嘤嘤

    究极题面魔法术lalala(傻子博主)

    这题呢,基本上就是一个裸的最短路,虽然老师让我们用dijkstra去做,但是。。好像spfa等也可以过,当然这里还是用老师要用的方法比较好

     1 #include<set>
     2 #include<map>
     3 #include<list>
     4 #include<queue>
     5 #include<stack>
     6 #include<string>
     7 #include<cmath>
     8 #include<ctime>
     9 #include<vector>
    10 #include<bitset>
    11 #include<memory>
    12 #include<utility>
    13 #include<cstdio>
    14 #include<sstream>
    15 #include<iostream>
    16 #include<cstdlib>
    17 #include<cstring>
    18 #include<algorithm>
    19 using namespace std;
    20 
    21 int n,m,s,t,tot;
    22 int next[1000005],head[1000005],to[1000005],cost[1000005],value[1000005],dis[1000005],ans_c[1000005];
    23 struct node{
    24     int id,d,v;
    25 }a[1000005];
    26 bool operator > (const node a,const node b){//重构
    27     return a.d>b.d;
    28 }
    29 priority_queue <node,vector<node>,greater<node> > Q;//小根堆进行堆优化
    30 
    31 void add(int u,int v,int w,int p){//链式前向星
    32     next[++tot]=head[u];
    33     head[u]=tot;
    34     to[tot]=v;
    35     cost[tot]=w;
    36     value[tot]=p;
    37     return;
    38 }
    39 void dijkstra(){//最短路
    40     memset(dis,0x3f,sizeof(dis));
    41     memset(ans_c,0x3f,sizeof(ans_c));
    42     dis[s]=0;
    43     ans_c[s]=0;
    44     Q.push((node){s,0,0});
    45     while(!Q.empty()){
    46         node x=Q.top(); 
    47         Q.pop();
    48         for(int i=head[x.id];i;i=next[i])
    49             if(x.d+cost[i]<dis[to[i]]||(x.d+cost[i]==dis[to[i]]&&ans_c[to[i]]>x.v+value[i])){//意为若该路径小于记录下来的路径或是等于但费用较小
    50                 dis[to[i]]=x.d+cost[i];
    51                 ans_c[to[i]]=x.v+value[i];
    52                 Q.push((node){to[i],dis[to[i]],ans_c[to[i]]});
    53             }
    54     }
    55     return;
    56 }
    57 int main(){
    58     while(1){
    59         scanf("%d%d",&n,&m);
    60         if(n==0&&m==0){//结束条件
    61             break;
    62         }
    63         memset(head,0,sizeof(head));
    64         while(!Q.empty()){Q.pop();}
    65         for(int i=1;i<=m;i++){
    66             int u,v,w,c;
    67             scanf("%d%d%d%d",&u,&v,&w,&c);
    68             add(u,v,w,c);//因为无向图,故双向路径
    69             add(v,u,w,c);
    70         }
    71         scanf("%d%d",&s,&t);
    72         memset(dis,0,sizeof(dis));
    73         memset(ans_c,0,sizeof(ans_c));
    74         dijkstra();
    75         printf("%d %d
    ",dis[t],ans_c[t]);
    76     }
    77     return 0;
    78 }

    这题在机房敲了好长时间地说。。完全和AC代码没有区别。。回家重打了一遍,然后就过了???莫名。。

  • 相关阅读:
    前端学PHP之错误处理
    mysql数据库学习目录
    前端学数据库之存储
    前端学数据库之函数
    用shell脚本监控进程是否存在 不存在则启动的实例
    在notepad++里面使用正则表达式替换掉所有行逗号前面内容
    mysql合并 两个count语句一次性输出结果的方法
    硬件中断和DPC一直占40-52%左右 解决方法
    解决secureCRT 数据库里没有找到防火墙 '无' 此会话降尝试不通过防火墙进行连接。
    Java eclipse下 Ant build.xml实例详解 附完整项目源码
  • 原文地址:https://www.cnblogs.com/hahaha2124652975/p/11124122.html
Copyright © 2011-2022 走看看