• AOJ2249最短路+最小费用


    题意:求出某个点到其他点的最短路,并求出在最短路情况下的最小费用

    分析:用dijkstra求出最短路并同时更新最小费用即可,注意的是在最短路长度相同时费用取最小即可

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <set>
     8 #include <map>
     9 #include <bitset>
    10 #include <cmath>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 const int maxn=20010;
    15 const int INF=1<<28;
    16 struct edge{
    17     int to,dis,cost;
    18 };
    19 typedef pair<int,int> P;
    20 int n,m;
    21 vector<edge> g[maxn];
    22 int d[maxn];
    23 int pay[maxn];
    24 void dijkstra(int s)
    25 {
    26     priority_queue<P,vector<P>, greater<P> >que;
    27     fill(d,d+n+1,INF);
    28     fill(pay,pay+n+1,INF);
    29     d[s]=0;
    30     que.push(P(0,s));
    31     while(!que.empty())
    32     {
    33         P p=que.top(); que.pop();
    34         int v=p.second;
    35         if(d[v]<p.first)  continue;
    36         for(int i=0;i<g[v].size();i++)
    37         {
    38             edge e=g[v][i];
    39             //cout<<e.to<<"abd"<<endl;
    40             if(d[e.to]>d[v]+e.dis){
    41                 d[e.to]=d[v]+e.dis;
    42                 pay[e.to]=e.cost;
    43                 //num[e.to]=min(num[e.to],pay[e.to]);
    44                 que.push(P(d[e.to],e.to));
    45             }else if(d[e.to]==d[v]+e.dis){
    46                 pay[e.to]=min(e.cost,pay[e.to]);
    47             }
    48         }
    49     }
    50 }
    51 int main()
    52 {
    53     while(cin>>n>>m)
    54     {
    55         if(n+m==0)  break;
    56         for(int i=0;i<=maxn-1;i++) g[i].clear();
    57         for(int i=0;i<m;i++)
    58         {
    59             int u,v,d,c;
    60             scanf("%d%d%d%d",&u,&v,&d,&c);
    61             edge e;
    62             e.to=v,e.dis=d,e.cost=c;
    63             g[u].push_back(e);
    64             edge e1;
    65             e1.to=u,e1.dis=d,e1.cost=c;
    66             g[v].push_back(e1);
    67         }
    68         dijkstra(1);
    69         int sum=0;
    70         for(int i=2;i<=n;i++){
    71             sum+=pay[i];
    72         }
    73         cout<<sum<<endl;
    74     }
    75     return 0;
    76 }
    View Code
  • 相关阅读:
    密码学-网站的安全登录认证设计
    密码学-软件加密技术和注册机制
    密码学-数字证书原理
    Linux-ssh证书登录(实例详解)
    unity, multi collider
    unity, 相机空间 与 相机gameObject的局部空间
    unity, WaterProDaytime注意事项。
    unity, 欧拉角(euler angle)
    unity, mono断点
    unity5, import fbx注意事项
  • 原文地址:https://www.cnblogs.com/wolf940509/p/5706409.html
Copyright © 2020-2023  润新知