zoukankan      html  css  js  c++  java
  • poj1511 最短路

    题意:与poj3268一样,所有人需要从各点到一点再从一点到各点,求最短路总和。

    与poj3268一样,先正向建图跑 dijkstra ,得到该点到其他所有各点的最短路,即这些人回去的最短路,再用反向建的图跑一遍最短路,得到各点到该点的最短路,求和就行了。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<queue>
     5 #include<vector>
     6 using namespace std;
     7 typedef pair<int,int> pii;
     8 typedef long long ll;
     9 const int MAXM=1000000;
    10 struct cmp{
    11     bool operator ()(pii a,pii b){
    12         return a.first>b.first;
    13     }
    14 };
    15 
    16 int head1[MAXM+5],point1[MAXM+5],val1[MAXM+5],next1[MAXM+5],size1;
    17 int head2[MAXM+5],point2[MAXM+5],val2[MAXM+5],next2[MAXM+5],size2;
    18 int n,m;
    19 int dist1[MAXM+5],dist2[MAXM+5];
    20 
    21 void add1(int a,int b,int v){
    22     point1[size1]=b;
    23     val1[size1]=v;
    24     next1[size1]=head1[a];
    25     head1[a]=size1++;
    26 }
    27 
    28 void add2(int a,int b,int v){
    29     point2[size2]=b;
    30     val2[size2]=v;
    31     next2[size2]=head2[a];
    32     head2[a]=size2++;
    33 }
    34 
    35 void dij(int s){
    36     int i;
    37     priority_queue<pii,vector<pii>,cmp>q;
    38     memset(dist1,0x3f,sizeof(dist1));
    39     memset(dist2,0x3f,sizeof(dist2));
    40     dist1[s]=dist2[s]=0;
    41     q.push(make_pair(dist1[s],s));
    42     while(!q.empty()){
    43         pii u=q.top();
    44         q.pop();
    45         if(u.first>dist1[u.second])continue;
    46         for(i=head1[u.second];~i;i=next1[i]){
    47             int j=point1[i];
    48             if(dist1[j]>dist1[u.second]+val1[i]){
    49                 dist1[j]=dist1[u.second]+val1[i];
    50                 q.push(make_pair(dist1[j],j));
    51             }
    52         }
    53     }
    54     while(!q.empty())q.pop();
    55     q.push(make_pair(dist2[s],s));
    56     while(!q.empty()){
    57         pii u=q.top();
    58         q.pop();
    59         if(u.first>dist2[u.second])continue;
    60         for(i=head2[u.second];~i;i=next2[i]){
    61             int j=point2[i];
    62             if(dist2[j]>dist2[u.second]+val2[i]){
    63                 dist2[j]=dist2[u.second]+val2[i];
    64                 q.push(make_pair(dist2[j],j));
    65             }
    66         }
    67     }
    68     ll ans=0;
    69     for(i=1;i<=n;i++){
    70         ans+=dist1[i];
    71         ans+=dist2[i];
    72     }
    73     printf("%I64d
    ",ans);
    74 }
    75 
    76 int main(){
    77     int t;
    78     scanf("%d",&t);
    79         for(int q=1;q<=t;q++){
    80             scanf("%d%d",&n,&m);
    81             int i,a,b,v;
    82             memset(head1,-1,sizeof(head1));
    83             size1=0;
    84             memset(head2,-1,sizeof(head2));
    85             size2=0;
    86             for(i=1;i<=m;i++){
    87                 scanf("%d%d%d",&a,&b,&v);
    88                 add1(a,b,v);
    89                 add2(b,a,v);
    90             }
    91             dij(1);
    92         }
    93     
    94     return 0;
    95 }
    View Code
  • 相关阅读:
    领域驱动设计精简版--阅读笔记
    ATM机的面向对象分析--笔记
    第一部分 Spring 基础
    spring in action 5 笔记--spring 实战 第4版和第5版对比
    Redis深度历险
    《Spring in action》之Spring之旅
    递归算法(java)
    java中static学习总结
    浅谈HookSSDT和和Resume(恢复)SSDT
    转---派遣例程与IRP结构
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4785251.html
Copyright © 2011-2022 走看看