zoukankan      html  css  js  c++  java
  • 农场派对(party)(信息学奥赛一本通 1497)

    【题目描述】

    N(1≤N≤1000)头牛要去参加一场在编号为 x(1≤x≤N) 的牛的农场举行的派对。有 M(1≤M≤100000) 条有向道路,每条路长 Ti(1≤Ti≤100);每头牛都必须参加完派对后回到家,每头牛都会选择最短路径。求这 N头牛的最短路径(一个来回)中最长的一条的长度。 特别提醒:可能有权值不同的重边。

    【输入】

    第 1行:3 个空格分开的整数 N,M,X;

    第 2…M 行:3 个空格分开的整数 Ai,Bi,Ti ​​,表示有一条从 Ai 到 Bi的路,长度为 Ti。

    【输出】

    一行一个数,表示最长最短路的长度(<231-1)。

    【输入样例】

    4 8 2

    1 2 4

    1 3 2

    1 4 7

    2 1 1

    2 3 5

    3 1 2

    3 4 4

    4 2 3

    【输出样例】

    10


    spfa求从x到各点的最短路径(di[i])以及从各点到x的最短路径(d[x]),并用邻接表进行优化

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct node{
     4     int to,next,w;
     5 }a[21000];
     6 queue<int>q;
     7 int n,m,x,num,head[100001],ma=-1,mi,cnt;
     8 int d[10001],z[1001][1001],di[10001];
     9 bool b[10001];
    10 void add(int from,int to,int w)
    11 {
    12     a[++cnt].to=to;
    13     a[cnt].next=head[from];
    14     a[cnt].w=w;
    15     head[from]=cnt;
    16 }
    17 void spfa(int s)
    18 {
    19     memset(d,127,sizeof(d));
    20     d[s]=0;b[s]=true;
    21     q.push(s);
    22     while(!q.empty())
    23     {
    24         int u=q.front();q.pop();
    25         for(int i=head[u];i;i=a[i].next)
    26         {
    27             int to=a[i].to;
    28             if(d[to]>d[u]+a[i].w)
    29             {
    30                 d[to]=d[u]+a[i].w;
    31                 if(!b[to])
    32                 {
    33                     b[to]=true;
    34                     q.push(to);
    35                 }
    36             }
    37         }
    38         b[u]=false;//别忘了这句话
    39     }
    40 }
    41 int main()
    42 {
    43     //freopen("party.in","r",stdin);
    44     //freopen("party.out","w",stdout);
    45     cin>>n>>m>>x;
    46     for(int i=1;i<=m;i++)
    47     {
    48         int a,b,c;
    49         cin>>a>>b>>c;
    50         add(a,b,c);
    51     }
    52     spfa(x);//从x到各点的最短路径
    53     memcpy(di,d,sizeof d);//将数组d的值全部复制给di
    54     for(int i=1;i<=n;i++)
    55     {
    56         if(i!=x)
    57         {
    58             spfa(i);//各点到x的最短路径
    59             ma=max(ma,d[x]+di[i]);//求最短中的最长
    60         }
    61     }
    62     cout<<ma;
    63     return 0;
    64 }

     

  • 相关阅读:
    记下mongoose(转载)
    vue vue-cli中引入全局less变量的方式
    单标签不支持 伪元素
    删除tppabs,href="javascript:if(confirm)...",、/*tpa=http://...
    系统字体放大导致rem布局错乱,解决方案,已通过测试
    IE条件注释
    hbase部署经验与坑总结
    ubuntu安装mysql 5.7
    静态代理和动态代理
    单例模式
  • 原文地址:https://www.cnblogs.com/ljy-endl/p/11285884.html
Copyright © 2011-2022 走看看