AC日记——货车运输 codevs
A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。
第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路。
接下来 m 行每行 3 个整数 x、y、z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z 的道路。注意:x 不等于 y,两座城市之间可能有多条道路。
接下来一行有一个整数 q,表示有 q 辆货车需要运货。
接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输货物到 y 城市,注意:x 不等于 y。
输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货车不能到达目的地,输出-1。
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
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。
分类标签 Tags 点此展开
思路:
最大生成树+lca
来,上代码:
#include<cstdio>
#include<algorithm> using namespace std; struct node {
int from,to,dis,next;
};
struct node usee[];
struct node edge[];
int n,m,head[],num=;
int f[],bnum=,tail=;
int cur=,dfn[],tarjan_dfn=; int max(int a,int b){return a>b?a:b;} int min(int a,int b){return a<b?a:b;} void tarjan(int scre,int before)
{
tarjan_dfn++;
dfn[scre]=tarjan_dfn;
for(int i=head[scre];i!=;i=edge[i].next)
{
if(edge[i].to!=before)
{
tarjan(edge[i].to,scre);
}
}
} int tarjan_lca(int minn,int maxn)
{
int kop=minn,kol=maxn,kcc=1e18;
while(dfn[kol]>dfn[minn])
{
for(int i=head[kol];i!=;i=edge[i].next)
{
if(dfn[edge[i].to]<dfn[kol])
{
kol=edge[i].to;
kcc=min(kcc,edge[i].dis);
break;
}
}
}
while(dfn[kop]>dfn[kol])
{
for(int i=head[kop];i!=;i=edge[i].next)
{
if(dfn[edge[i].to]<dfn[kop])
{
kop=edge[i].to;
kcc=min(kcc,edge[i].dis);
break;
}
}
}
return kcc;
} int cmp(struct node a,struct node b){return a.dis>b.dis;} void edge_add(int from,int to,int dis)
{
num++;
edge[num].to=to;
edge[num].dis=dis;
edge[num].from=from;
edge[num].next=head[from];
head[from]=num;
} int find(int x)
{
if(x==f[x]) return f[x];
else return f[x]=find(f[x]);
} int qread()
{
int x=;char ch=getchar();
while(ch>''||ch<'') ch=getchar();
while(ch<=''&&ch>=''){x=x*+(int)(ch-'');ch=getchar();}
return x;
} int main()
{
n=qread(),m=qread();
for(int i=;i<n;i++)
{
f[i]=i;
bnum++;
usee[bnum].from=i;
usee[bnum].to=i+;
usee[bnum].dis=-;
}
f[n]=n;
int from,to,dis;
for(int i=;i<=m;i++)
{
from=qread(),to=qread(),dis=qread();
bnum++;
usee[bnum].to=to;
usee[bnum].dis=dis;
usee[bnum].from=from;
}
sort(usee+,usee+bnum+,cmp);
int x,y;
while(tail<n-)
{
cur++;
x=find(usee[cur].from),y=find(usee[cur].to);
if(x!=y)
{
tail++;
edge_add(usee[cur].from,usee[cur].to,usee[cur].dis);
edge_add(usee[cur].to,usee[cur].from,usee[cur].dis);
f[x]=y;
}
}
tarjan(,);
int q=qread();
while(q--)
{
from=qread(),to=qread();
dfn[from]<dfn[to]?printf("%d\n",tarjan_lca(from,to)):printf("%d\n",tarjan_lca(to,from));
}
return ;
}
AC日记——货车运输 codevs的更多相关文章
- AC日记——约瑟夫问题 codevs 1282
1282 约瑟夫问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 有编号从1到N的N个小 ...
- AC日记——[NOIP2015]运输计划 cogs 2109
[NOIP2015] 运输计划 思路: 树剖+二分: 代码: #include <cstdio> #include <cstring> #include <iostrea ...
- AC日记——丑数 codevs 1246
1246 丑数 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 对于一给定的素 ...
- AC日记——砍树 codevs 1388
1388 砍树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 伐木工人米尔科需要砍倒M米长的木 ...
- AC日记——元素查找 codevs 1230
1230 元素查找 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 给出n个正整数,然后有 ...
- AC日记——石子归并 codevs 1048
1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 有n堆石子排成一列,每堆石子 ...
- AC日记——搞笑世界杯 codevs 1060(dp)
题目描述 Description 随着世界杯小组赛的结束,法国,阿根廷等世界强队都纷纷被淘汰,让人心痛不已. 于是有 人组织了一场搞笑世界杯,将这些被淘汰的强队重新组织起来和世界杯一同比赛.你和你的朋 ...
- AC日记——产生数 codevs 1009 (弗洛伊德)(组合数学)
1009 产生数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descriptio ...
- AC日记——平衡树练习 codevs 4244
4244 平衡树练习 思路: 有节操的人不用set也不用map: 代码: #include <cstdio> #include <cstring> #include <i ...
随机推荐
- Ubuntu 开机启动不执行
解决方案: 1.将/etc/rc.local的命令改成更加兼容的模式,将"#!/bin/sh"改为"#!/bin/bash" 2.将/bin/sh重新链接到/b ...
- C++:100阶乘数组输出
#include <iostream> using namespace std; int main(){ int i =1; int a[2048]={0}; while(i !=101) ...
- Thinkhphp5控制器调用的Model层的方法总结
控制器器里: <?php /** * Created by PhpStorm. * User: Haima * Date: 2018/7/8 * Time: 15:58 */ namespace ...
- percpu之静态变量
参考:Linux内核同步机制之(二):Per-CPU变量 CPU私有变量(per-CPU变量) 动态PCPU变量 setup_per_cpu_areas()初始化per-cpu数据. static v ...
- stm32定时器学习二——PWM设置
/* STM32 嵌入式学习入门(5)——PWM的实现 上一篇博文介绍了定时器和PWM的基本的原理,本篇博文从代码层面来介绍PWM的具体实现.同样,还是以博主所用的开发板——正点原子开发板STM32F ...
- ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track
262144K Morgana is learning computer vision, and he likes cats, too. One day he wants to find the ...
- poj 3187 三角数问题
题意:给你两个数,一个n表示这个三角有多少层,一个sum表示总和 思路: 类似杨辉三角 1 1 1 1 2 1 第n行的第k个数 为 n!/k!(n-k)! 暴力枚举,因 ...
- poj--1064
题意:有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的绳子的话,这K条绳子最长能有多长?答案保留到小数点后2位. 思路:这些最大最小化问题大多数可以用二分查找的方法来解题 用 d 表 ...
- JavaScript 将当地时间转换成其它时区
毫无疑问,用JavaScript脚本可以通过直接查看用户的时钟,方便地在网页上显示本地时间. 但是,如果你想显示不同地区的时间—--例如,如果你的本部在别的国家,你想查看“本国”时间而非当地时间,又该 ...
- MySQL中的DDL(Data Definition Language,数据定义语言)
create(创建表) 标准的建表语句: create table [模式名.]表名 ( #可以有多个列定义 columnName1 dataType [default expr(这是默认值)], . ...