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 ...
随机推荐
- 《Spring源码深度解析》第三章 默认标签的解析
上一章提到了,默认标签和自定义标签要分开解析.本章重点介绍默认标签的解析.在 DefaultBeanDefinitionDocumentReader 中: private void parseDefa ...
- 如何用 CSS 和 D3 创作火焰动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xJdVxx 可交互视频 ...
- 百度地图和高德地图的API视频教程
学习地址: http://www.houdunren.com/houdunren18_lesson_152?vid=10228 素材地址: https://gitee.com/houdunwang/v ...
- python之路-双下方法
双下方法 定义: 双下方法是特殊方法,他是解释器提供的,由双下线加方法名加双下划线 __方法名__具有特殊意义的方法 双下方法主要是Python源码程序员使用的,元编程 我们在开发中尽量不要使用双下方 ...
- 网络流之Dinic算法
初学网络流.存一下Dinic板子. 复杂度O(n^2*m) UVA - 1515 Pool construction 把每个草地与 S 相连,花费为dig,每个洞与 T 相连,花费为 然后对于每个两个 ...
- The 2018 ACM-ICPC Chinese Collegiate Programming Contest Maximum Element In A Stack
//利用二维数组模拟 #include <iostream> #include <cstdio> #include <cstring> #include <s ...
- Android自动化测试如何获取坐标点?
有以下三种方法: 1.打开开发者选项中的“显示指针位置”: 英文文版本为Settings->Developer option->Show touches(on)->Pointer l ...
- python列出指定目录下的所有目录和文件
import os import docx def scanfile(rootdir): result = [] for f in os.walk(rootdir): for files in f[2 ...
- PHP smarty模版引擎基本安装
环境: PHP5.2 以上版本 先去官网下载smarty模版引擎的库文件到你的电脑或服务器上 smarty官方网站库文件下载地址: https://www.smarty.net/download 下 ...
- Python生成器、三元表达式、列表生成式、字典生成式、生成器表达式
什么是生成器:只要函数内部包含有yield关键字,那么函数名()的到的结果(生成器地址)就是生成器,再调用函数不会执行函数内部代码这个生成器本身有 _iter_ he _next_功能(即生成器 ...