• 洛谷—— P1967 货车运输 || COGS——C 1439. [NOIP2013]货车运输


    https://www.luogu.org/problem/show?pid=1967#sub  ||  http://www.cogs.pro/cogs/problem/problem.php?pid=1439

    题目描述

    A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。

    输入输出格式

    输入格式:

    输入文件名为 truck.in。

    输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道

    路。 接下来 m 行每行 3 个整数 x、 y、 z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z 的道路。注意: x 不等于 y,两座城市之间可能有多条道路 。

    接下来一行有一个整数 q,表示有 q 辆货车需要运货。

    接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输货物到 y 城市,注意: x 不等于 y 。

    输出格式:

    输出文件名为 truck.out。

    输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货

    车不能到达目的地,输出-1。

    输入输出样例

    输入样例#1:
    4 3
    1 2 4
    2 3 3
    3 1 1
    3
    1 3
    1 4
    1 3
    输出样例#1:
    3
    -1
    3

    说明

    对于 30%的数据,0 < n < 1,000,0 < m < 10,000,0 < q< 1,000;

    对于 60%的数据,0 < n < 1,000,0 < m < 50,000,0 < q< 1,000;

    对于 100%的数据,0 < n < 10,000,0 < m < 50,000,0 < q< 30,000,0 ≤ z ≤ 100,000。

    感觉驾驭不了倍增额。。  COGS上竟然没有-1的时候~~~

    最朴素的LCA(syl所授)

    最大生成树+LCA

     1 #include <algorithm>
     2 #include <cstring>
     3 #include <cstdio>
     4  
     5 using namespace std;
     6  
     7 const int N(50000+5);
     8 int n,m,u,v,w,p;
     9  
    10 struct Node
    11 {
    12     int u,v,w;
    13 }road[N<<1];
    14 bool cmp(const Node &a,const Node &b)
    15 {
    16     return a.w>b.w;
    17 }
    18 int cnt,sumedge,head[N];
    19 struct Edge
    20 {
    21     int v,next,w;
    22     Edge(int v=0,int next=0,int w=0):
    23         v(v),next(next),w(w){}
    24 }edge[N<<1];
    25 void ins(int u,int v,int w)
    26 {
    27     edge[++sumedge]=Edge(v,head[u],w);
    28     head[u]=sumedge;
    29 }
    30  
    31 int fa[N];
    32 int find(int x)
    33 {
    34     return x==fa[x]?x:fa[x]=find(fa[x]);
    35 }
    36  
    37 int deep[N],dad[N],lim[N];
    38 void DFS(int x)
    39 {
    40     for(int i=head[x];i;i=edge[i].next)
    41     {
    42         int v=edge[i].v;
    43         if(dad[v]) continue;
    44         deep[x]=deep[dad[x]]+1;
    45         lim[v]=edge[i].w;
    46         dad[v]=x; DFS(v);
    47     }
    48 }
    49 int LCA(int x,int y)
    50 {
    51     int minx=0x7fffffff,minn=0x7fffffff;
    52     if(deep[x]>deep[y]) swap(x,y);
    53     for(;deep[y]>deep[x];y=dad[y]) minx=min(minx,lim[y]);
    54     for(;x!=y;x=dad[x],y=dad[y])
    55         minx=min(minx,lim[y]),minn=min(minn,lim[x]);
    56     return min(minx,minn);
    57 }
    58 int main()
    59 {
    60 //    freopen("truck.in","r",stdin);
    61 //    freopen("truck.out","w",stdout);
    62     
    63     scanf("%d%d",&n,&m);
    64     for(int i=1;i<=m;i++)
    65     {
    66         scanf("%d%d%d",&u,&v,&w);
    67         road[i].u=u,road[i].v=v,road[i].w=w;
    68     }
    69     sort(road+1,road+m+1,cmp);
    70     for(int i=1;i<=n;i++) fa[i]=i;
    71     for(int i=1;i<=m;i++)
    72     {
    73         int fx=find(road[i].u),fy=find(road[i].v);
    74         if(fx==fy) continue;
    75         cnt++;
    76         fa[fx]=fy;
    77         ins(road[i].u,road[i].v,road[i].w);
    78         ins(road[i].v,road[i].u,road[i].w);
    79         if(cnt==n-1) break;
    80     }
    81     memset(lim,127/3,sizeof(lim));
    82     DFS(1);
    83     scanf("%d",&p);
    84     for(;p--;)
    85     {
    86         scanf("%d%d",&u,&v);
    87         printf("%d
    ",LCA(u,v));
    88     }
    89     return 0;
    90 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    linux系统编程综合练习-实现一个小型的shell程序(二)
    linux系统编程综合练习-实现一个小型的shell程序(一)
    Makefile学习二
    Makefile学习一
    jquery遍历:数组、对象、json
    ThinkPHP中:使用递归写node_merge()函数
    ThinkPHP中:多个项目共享同一个session问题
    多域名THINKPHP利用MEMCACHE方式共享SESSION数据
    ThinkPHP中:用户登录权限验证类
    ThinkPHP中:检查Session是否过期
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7215964.html
Copyright © 2020-2023  润新知