zoukankan      html  css  js  c++  java
  • POJ 3268 Silver Cow Party

    http://poj.org/problem?id=3268

    有一个点X开party 求其他所有点  去的路程和返程的和的最小值中的最大值

    这里有一个小技巧 

    总是把X当做原点 

    返程是正常的最短路

    去程就把路径翻转 求最短路 

    这样只需要两次求最短路 

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #include <queue>
     5 #include <algorithm>
     6 #define MAXV 1007
     7 #define MAXE 100007
     8 #define INF 0x3f3f3f3f
     9 using namespace std;
    10 
    11 typedef pair<int,int> P ;//first 是距离 second是编号
    12 struct Edge
    13 {
    14     int to, cost, next;
    15     Edge() {}
    16     Edge(int to, int cost, int next) : to(to), cost(cost), next(next) {}
    17 }edge1[MAXE], edge2[MAXE];
    18 
    19 int head1[MAXV], head2[MAXV];
    20 int num1 = 0, num2 = 0;
    21 void Add1(int from, int to, int cost)
    22 {
    23     edge1[num1] = Edge(to, cost, head1[from]);
    24     head1[from] = num1++;
    25 }
    26 
    27 void Add2(int from, int to, int cost)
    28 {
    29     edge2[num2] = Edge(to, cost, head2[from]);
    30     head2[from] = num2++;
    31 }
    32 
    33 int N, M, X;
    34 
    35 int dijkstra(int s,int dist[], int head[], Edge edge[])
    36 {
    37     //int dist[MAXV];
    38     priority_queue<P> que;
    39     fill(dist, dist+MAXV, INF);
    40     dist[s] = 0;
    41     que.push(P(0, s));
    42     while (!que.empty())
    43     {
    44         P p = que.top();
    45         que.pop();
    46         int t = head[p.second];
    47         if (dist[p.second] < p.first) continue;
    48         while (t != -1)
    49         {
    50             Edge e = edge[t];
    51             if(dist[e.to] > dist[p.second] + e.cost)
    52             {
    53                 dist[e.to] = dist[p.second] + e.cost;
    54                 que.push(P(dist[e.to], e.to));
    55             }
    56             t = e.next;
    57         }
    58     }
    59 }
    60 
    61 int main()
    62 {
    63     int ans[MAXV];
    64     int dist1[MAXV], dist2[MAXV];
    65     freopen("in.txt", "r", stdin);
    66     scanf("%d%d%d", &N, &M, &X);
    67     memset(head1, -1, sizeof(head1));
    68     memset(head2, -1, sizeof(head2));
    69     memset(edge1, -1, sizeof(edge1));
    70     memset(edge2, -1, sizeof(edge2));
    71     memset(ans, 0, sizeof(ans));
    72     for (int i = 0; i < M; i++)
    73     {
    74         int from, to, cost;
    75         scanf("%d%d%d", &from, &to, &cost);
    76         Add1(from, to, cost);
    77         Add2(to, from, cost);
    78     }
    79     dijkstra(X, dist1, head1, edge1);//正常返回的路径
    80     dijkstra(X, dist2, head2, edge2);//路径翻转之后 得到的dist就是 i到达X的路径
    81     for (int i = 1; i <= N; i++)
    82     {
    83         ans[i] = dist1[i] + dist2[i];
    84     }
    85     sort(ans+1, ans+N+1);
    86     printf("%d
    ", ans[N]);
    87     return 0;
    88 }
  • 相关阅读:
    分支与合并@基础
    创业者那些鲜为人知的事情
    centos7.5+nginx+php急速配置
    通过webhost扩展方式初始化EFCore数据库
    AspNetCore架构图
    Linux就该这样学--之常用linux命令及bash基础
    使用gitlab构建基于docker的持续集成(三)
    使用gitlab构建基于docker的持续集成(二)
    使用gitlab构建基于docker的持续集成(一)
    使用docker-compose配置mysql数据库并且初始化用户
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6399650.html
Copyright © 2011-2022 走看看