NOIP 2013 货车运输 最大生成树加DFS巧妙AC
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define MAXN 10005
#define MAXM 100005 using namespace std; struct Edge { int from; int to; int val; int next; }; int n;
int m;
int q;
int cnt;
int num;
int f[MAXN];
int lv[MAXN];
int vis[MAXN];
int dis[MAXN];
int pre[MAXN];
int head[MAXN]; Edge s[MAXM],edge[MAXM]; inline bool cmp(Edge x,Edge y) { return x.val>y.val; } inline int find(int x)
{
if (f[x]!=x) return f[x]=find(f[x]);
return f[x];
} inline void add(int u,int v,int w)
{
edge[++cnt].from=u;
edge[cnt].to=v;
edge[cnt].val=w;
edge[cnt].next=head[u];
head[u]=cnt; return ;
} inline void dfs(int u)
{
for (int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if (!vis[v])
{
pre[v]=u; vis[v]=;
dis[v]=min(dis[v],edge[i].val);
lv[v]=lv[u]+; dfs(v);
}
} return ;
} inline int work(int x,int y)
{
int ans=;
while(lv[x]>lv[y]) ans=min(ans,dis[x]),x=pre[x];
while(lv[y]>lv[x]) ans=min(ans,dis[y]),y=pre[y];
while(x!=y) ans=min(ans,min(dis[x],dis[y])),x=pre[x],y=pre[y];
return ans;
} inline void solve()
{
scanf("%d%d",&n,&m); memset(dis,0x7f,sizeof(dis));
for (int i=;i<=n;i++) f[i]=i;
for (int i=;i<=m;i++)
scanf("%d%d%d",&s[i].from,&s[i].to,&s[i].val);
sort(s+,s++m,cmp); num=; cnt=;
for (int i=;i<=m&&num!=n-;i++)
{
int fa=find(s[i].from); int fb=find(s[i].to);
if (fa!=fb)
{
f[fa]=fb; num++;
add(s[i].from,s[i].to,s[i].val);
add(s[i].to,s[i].from,s[i].val);
}
} scanf("%d",&q); memset(vis,,sizeof(vis));
for (int i=;i<=n;i++)
if (!vis[i]) pre[i]=,lv[i]=vis[i]=,dfs(i);
for (int i=;i<=q;i++)
{
int a; int b; scanf("%d%d",&a,&b);
int fa=find(a); int fb=find(b);
if (fa!=fb) printf("-1\n");
else printf("%d\n",work(a,b));
} return ;
} int main()
{
solve();
return ;
}
废话我就不多说了 最初这道题写的是最大生成树加DFS搜索的 只能得到六十分 后来改成DFS的预处理 预处理的复杂度是O(n)的。
然后对于每一次询问 我这个算法的时间复杂度最坏是O(n)的。 也就是一棵树有两条链 询问的两个点分别是两条链底部的点。
不过数据显然没有这么水的 所以复杂度一般低于O(n)。
说一说做法哈 先预处理所有的边 求出最大生成树 没有的话无所谓 只要所有的边扫一下 判边的话我用的是并查集维护
把可以要的边留下就好 然后把这些边连起来
对于每一个没有搜索过的点就去DFS搜一下 对于搜到的每一个节点要做一个等级标记 根节点等级是1 根节点的所有子节点等级是2 以此类推
DFS过程中记录一下每个点的前驱 以及每个点到它父亲的路径的权值 最后对于每一个询问AB两点
我用语言是不好说的 详情请看代码中的work代码 应该是非常容易理解的 嗯~ o(* ̄▽ ̄*)o 小编就先说到这里吧
如果看了有什么不懂的地方就在下面评论吧 小编会在12小时内给你满意的答复的 谢谢大家o(* ̄▽ ̄*)ブ
NOIP 2013 货车运输 最大生成树加DFS巧妙AC的更多相关文章
- NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】
NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...
- [NOIp 2013]货车运输
Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重 ...
- NOIP 2013货车运输
当然这题有很多做法,但是我看到没有人写DSU的很惊奇 按照之前做连双向边题的经验,这题可以用并查集维护联通 然后对于每个询问\(x,y\),考虑启发式合并 当两个点集\(x,y\)合并时,一些涉及到其 ...
- NOIP提高组 2013货车运输
觉得题目水的离开 不屑的大佬请离开 不会图论的请离开 ……. 感谢您贡献的访问量 ————————————华丽的分割线———————————— 题面: 题目描述 A 国有 n 座城市,编号从 1 到 ...
- 【NOIP】提高组2013 货车运输
[算法]最大生成树+LCA(倍增) [题解]两点间选择一条路径最小值最大的路径,这条路径一定在最大生成树上,因为最大生成树就是从边权最大的边开始加的. 先求原图的最大生成树(森林),重新构图,然后用一 ...
- 题解 【luoguP1967 NOIp提高组2013 货车运输】
题目链接 题解 题意 给你一个无向图,求两个点之间的一条路径,使路径上的最小值最大 算法:Kruskal最大生成树+倍增lca 分析 首先容易知道,答案一定在该图的最大生成树上 之后问题便转换成了树上 ...
- TZOJ 4848 货车运输(最大生成树+倍增lca)
描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...
- 【NOIP2013】货车运输 最大生成树+LCA
题目描述 AA国有nn座城市,编号从 1到n,城市之间有m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...
- $Noip2013/Luogu1967$ 货车运输 最大生成树+倍增$lca$
$Luogu$ $Sol$ 首先当然是构建一棵最大生成树,然后对于一辆货车的起点和终点倍增跑$lca$更新答案就好.记得预处理倍增的时候不仅要处理走了$2^i$步后是那个点,还有这中间经过的路径权值的 ...
随机推荐
- 【javaweb学习】解析XML
XML解析方式有两种 dom:Document Object Model文档对象模型,是w3c组织推荐的解析方式 sax:Simple Api XML不是官方标准,但它是XML社区实际上的标准,几乎所 ...
- 【java基础学习】反射
1. 什么是反射 Class.Method.Field.Constructor,它们是反射对象.它们是类.方法.成员变量.构造器,在内存中的形式. 也就是万物皆对象!类是类型.方法是类型.成员变量是类 ...
- solr 设置时区
问题 solr5.2: 发现打印log时间和真实时间对不上,服务器时间设置没有问题,后来发现,solr需要设置时区 解决方法: 直接修改bin/solr.in.sh 文件 #SOLR_TIMEZONE ...
- C#多线程环境下调用 HttpWebRequest 并发连接限制
C#多线程环境下调用 HttpWebRequest 并发连接限制 .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 win ...
- 随手记一次利用webbowser控件打开网页后cookie读取与设置
利用wininet.dll 组件读取cookie : [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError ...
- Windows Server 2008 R2组策略设置计算机配置和用户配置
一.认识Windows Server 2008 R2域控组策略管理 1.域控服务器zhuyu.com的组策略管理默认会读取AD用户和计算机目录下创建的OU容器(组织单元), 在对应的OU容器创建对应的 ...
- Python模块和包
模块和包是python组织代码的基本方式. 模块: python的每一个脚本文件都可称之为模块,模块的名称就是脚本的文件名.例如当我们写了一个test.py的脚本文件,则可以在同目录下的另外一个脚本m ...
- js 四舍五入
举例excel: ROUND 会四舍五入的:ROUNDDOWN 取小数点后两位数据,不管进位问题:ROUNDUP 取小数点后两位数据,只要有第三位小数都会进位的.关键看你取数的要求 在js如果要求 ...
- 【C#进阶】override new virtual
class Organ { public virtual void Intro() { Console.WriteLine("I'm a organ."); } public st ...
- Android系统拍照源码
个人对于Android系统拍照的一些总结:一种自定义图片拍照路径 ,另一种直接利用Android拍照后经过处理的缩略图 特别注意第一种方式需要增加SDK读写权限: <uses-permissio ...