洛谷—— 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\n",LCA(u,v));
88     }
89     return 0;
90 }

 

posted @ 2017-07-21 09:13  Aptal丶  阅读(263)  评论(0编辑  收藏  举报