zoukankan      html  css  js  c++  java
  • sdut2493Constructing Roads

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2493

    题意:对于一个给定的无向图,求其中有一条边的边权可以减半的情况下 从 A 点到 B 点的最短路。
    做法:可以用spfa求出 A
    到所有点的最短路 dis 和 B  到所有点的最短路 dis1 。然后枚举所有边(u,v),找出最小的dis[ u ] + w(u,v) / 2 +
    dis1[ v ] 即可,如果A、B不可达,输出“No solution”。

    View Code
     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<queue>
     6 using namespace std;
     7 #define INF 0x3f3f3f
     8 struct node
     9 {
    10     int u,v,next,w;
    11 }men[100010];
    12 struct node o[50010];
    13 int first[1010],t;
    14 void init()
    15 {
    16     t = 0;
    17     memset(first,-1,sizeof(first));
    18 }
    19 void add(int u,int v,int w)
    20 {
    21     men[t].v = v;
    22     men[t].w = w;
    23     men[t].next = first[u];
    24     first[u] = t;
    25     t++;
    26 }
    27 void spfa(int n,int s,int *dis)
    28 {
    29     int i,j,k;
    30     int f[1010];
    31     memset(f,0,sizeof(f));
    32     for(i = 1; i <= n ; i++)
    33     dis[i] = INF;
    34     queue<int>q;
    35     dis[s] = 0;
    36     q.push(s);
    37     while(!q.empty())
    38     {
    39         int v = q.front();
    40         q.pop();
    41         f[v] = 0;
    42         for(i = first[v] ; i != -1 ; i = men[i].next)
    43         {
    44             int tv = men[i].v;
    45             int tw = men[i].w;
    46             if(dis[tv]>dis[v]+tw)
    47             {
    48                 dis[tv] = dis[v]+tw;
    49                 if(!f[tv])
    50                 {
    51                     q.push(tv);
    52                     f[tv] = 1;
    53                 }
    54             }
    55         }
    56     }
    57 }
    58 int main()
    59 {
    60     int n,m,u,v,w,i,j,k,a,b;
    61     int dis1[1010],dis2[1010];
    62     while(cin>>n>>m)
    63     {
    64         init();
    65         for(i = 1; i <= m ; i++)
    66         {
    67             cin>>o[i].u>>o[i].v>>o[i].w;
    68             add(o[i].u,o[i].v,o[i].w);
    69             add(o[i].v,o[i].u,o[i].w);
    70         }
    71         cin>>a>>b;
    72         spfa(n,a,dis1);
    73         spfa(n,b,dis2);
    74         if(dis1[b]==INF)
    75         {
    76             cout<<"No solution\n";
    77             continue;
    78         }
    79         int mi = INF;
    80         for(i = 1; i <= m ; i++)
    81         {
    82             mi = min(mi,dis1[o[i].u]+dis2[o[i].v]+o[i].w/2);
    83             mi = min(mi,dis1[o[i].v]+dis2[o[i].u]+o[i].w/2);
    84         }
    85         if(mi<INF)
    86         cout<<mi<<endl;
    87         else
    88         cout<<"No solution\n";
    89     }
    90     return 0;
    91 }
  • 相关阅读:
    iOS js交互
    崩溃!UIAlertController 引起的崩溃
    跳转到AppStore下载app
    installshield basic msi 更新时覆盖不了上一个版本文件解决方案1
    用ILMerge.exe合并dll
    获取某几个分类下的前N条数据 mssql语句
    计算网络文件的大小
    英语 2018-12-04 2法国燃料涨价抗议活动
    英语2018-12-04
    从一个故事说起,谈谈企业应用架构的演变史
  • 原文地址:https://www.cnblogs.com/shangyu/p/2799131.html
Copyright © 2011-2022 走看看