zoukankan      html  css  js  c++  java
  • hdu

    http://acm.hdu.edu.cn/showproblem.php?pid=2066

    把与草儿相连的城市最短距离置为0,然后进行dijkstra,在t个城市里找出距离最近的一个即可。

     1 #include <iostream>
     2 #include <vector>
     3 #include <queue>
     4 #include <cstdio>
     5 using namespace std;
     6 
     7 const int maxn = 1010;
     8 const int INF = 1<<29;
     9 struct edge {
    10     int to,cost;
    11     edge(){}
    12     edge( int x,int y ) {
    13         to=x;
    14         cost=y;
    15     }
    16 };
    17 
    18 typedef pair<int,int>P;
    19 vector<edge>G[maxn];
    20 int d[maxn],s[maxn],e[maxn];
    21 int T,S,D,n;
    22 
    23 void dijkstra() {
    24     priority_queue<P,vector<P>,greater<P> >que;
    25     for(int i=1;i<=n;i++) d[i]=INF;
    26     for(int i=1;i<=S;i++)
    27     {
    28         d[s[i]]=0;
    29         que.push(P(0,s[i]));
    30     }
    31     while(!que.empty()) {
    32         P p=que.top(); que.pop();
    33         int v=p.second;
    34         if(d[v]<p.first) continue;
    35         for(int i=0;i<G[v].size();i++) {
    36             edge e=G[v][i];
    37             if(d[e.to]>d[v]+e.cost) {
    38                 d[e.to]=d[v]+e.cost;
    39                 que.push(P(d[e.to],e.to));
    40             }
    41         }
    42     }
    43 }
    44 
    45 int main()
    46 {
    47     //freopen("a.txt","r",stdin);
    48     while(~scanf("%d%d%d",&T,&S,&D))
    49     {
    50         for(int i=1;i<=maxn;i++) G[i].clear();
    51         n=0;
    52         int a,b,c,v;
    53         for(int i=1;i<=T;i++)
    54         {
    55             scanf("%d%d%d",&a,&b,&c);
    56          //   printf("%d %d %d
    ",a,b,c);
    57             G[a].push_back(edge(b,c));
    58             G[b].push_back(edge(a,c));
    59             if(a>n) n=a;
    60             if(b>n) n=b;
    61         }
    62         for(int i=1;i<=S;i++) scanf("%d",&s[i]);
    63         for(int i=1;i<=D;i++) scanf("%d",&e[i]);
    64         dijkstra();
    65         int ans=INF;
    66         for(int i=1;i<=D;i++)
    67             if(d[e[i]]<ans) ans=d[e[i]];
    68         printf("%d
    ",ans);
    69 
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    蓝翔杯子校内赛练习代码
    [蓝桥杯][算法训练VIP]猴子分苹果
    系统设计部分代码
    坐标离散化
    蒟蒻吃药计划-治疗系列 #round 1 机器分配+挖地雷
    蒟蒻吃药计划
    F小蒟蒻教你卡常
    最长不下降子序列
    最大子段和(DP)
    luogu P1216 (USACO1.5) Number Triangles
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4566128.html
Copyright © 2011-2022 走看看