lh的简单图论

http://10.64.70.166/problem/1112

Description

众所周知,集训队的lh同学txdy,有一天他在写着代码,突然哼起了raprap,哟,哟哟,你看这个碗它又大又圆,就像这个题它又短又难,skrskr,skrskr。

lhlh在着手解决一个图论的问题:

已知有一个nn个点的无向图,图中有mm条边,每条边的权值为w_iwi?。

lhlh想知道,他从点aa走到点bb,所走的最长的边长最小值是多少?

Input

第一行输入三个正整数n,m,qn,m,q,分别表示有nn个点mm条边和qq次询问。

接下来mm行,每行有三个数分别为u_iui?、v_ivi?、w_iwi?表示从点uu到点vv有一条路径边长为ww。

接下来qq行,每行有两个数aa,bb,表示lhlh想知道他从aa走到bb所走的最长的边长的最小值。

Output

输出qq行,每行一个正整数,表示他从点aa走到点bb,所走的最长的边长最小值是多少。

Sample Input 1

6 6 8
1 2 5
2 3 4
3 4 3
1 4 8
2 5 7
4 6 2
1 2
1 3
1 4
2 3
2 4
5 1
6 2
6 1 

Sample Output 1

5
5
5
4
4
7
4
5 

Hint

1≤n≤15000

1≤M≤30000

1≤wi?≤1000000000

1≤q≤20000

这个题目就是比较典型的图转树,这个好像就是UVA的11354

你要用最小生成树把图转变成树,然后再用LCA处理这棵树

#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 3e4 + 100;
int dp[maxn][30];
ll gw[maxn][30];
int deep[maxn];
int n, m, q, N;
struct node
{
    int from,to;
    ll dist;
    node(int from=0,int to=0,ll dist=0):from(from),to(to),dist(dist){}
}exa[maxn];
vector<node>vec[maxn];
int f[maxn];
int findx(int x)
{
    return f[x] == x ? x : f[x] = findx(f[x]);
}

void unite(int x,int y)
{
    x = findx(x);
    y = findx(y);
    if (x == y) return;
    f[x] = y;
}

bool same(int x,int y)
{
    return findx(x) == findx(y);
}
bool cmp(node a,node b)
{
    return a.dist < b.dist;
}

void dfs(int s)
{
    for(int i=1;i<=N;i++)
    {
        dp[s][i] = dp[dp[s][i - 1]][i - 1];
        gw[s][i] = max(gw[s][i - 1], gw[dp[s][i - 1]][i - 1]);
    }
    int len = vec[s].size();
    for(int i=0;i<len;i++)
    {
        node e = vec[s][i];
        if(e.to!=dp[s][0])
        {
            deep[e.to] = deep[s] + 1;
            dp[e.to][0] = s;
            gw[e.to][0] = e.dist;
            dfs(e.to);
        }
    }
}

ll LCA(int x,int y)
{
    if (x == y) return 0;
    if (deep[x] > deep[y]) swap(x, y);
    ll ans = 0;
    for(int i=N;i>=0;i--)//抬到同一高度
    {
        if(deep[x]<deep[y]&&deep[dp[y][i]]>=deep[x])
        {
            ans = max(ans, gw[y][i]);
            y = dp[y][i];
        }
    }
    for(int i=N;i>=0;i--)//一起往上走
    {
        if(dp[x][i]!=dp[y][i])
        {
            ans = max(ans, gw[x][i]);
            ans = max(ans, gw[y][i]);
            x = dp[x][i];
            y = dp[y][i];
        }
    }
    if(x!=y)//最后一步
    {
        ans = max(ans, gw[x][0]);
        ans = max(ans, gw[y][0]);
    }
    return ans;
}

int main()
{
    cin >> n >> m >> q;
    for(int i=1;i<=m;i++)
    {
        int a, b;
        ll w;
        cin >> a >> b >> w;
        exa[i] = node(a, b, w);
    }
    for (int i = 1; i <= n; i++) f[i] = i;
    sort(exa + 1, exa + 1 + m, cmp);
    for(int i=1;i<=m;i++)
    {
        int x = exa[i].from, y = exa[i].to;
        if (same(x, y)) continue;
        unite(x,y);
        vec[x].push_back(node(x, y, exa[i].dist));
        vec[y].push_back(node(y, x, exa[i].dist));
    }
    N = (log(n + 0.0)) / log(2.0);
    deep[1] = 0;
    dfs(1);
    for(int i=1;i<=q;i++)
    {
        int x, y;
        cin >> x >> y;
        ll ans = LCA(x, y);
        cout << ans << endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/EchoZQN/p/11478917.html

时间: 2024-10-14 18:57:56

lh的简单图论的相关文章

cdoj1580 简单图论问题

地址:http://acm.uestc.edu.cn/#/problem/show/1580 题目: 简单图论问题 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 给出一个无向图,该图由nn个点和mm条边组成,每个点和每条边都有一个权值.对于该图的任意一个子图,我们定义A是该子图的点权和,B是该子图的边权和,C=A/b=AB是该子图的powerpow

UVA - 10004 - Bicoloring (简单图论-着色判断)

UVA - 10004 Bicoloring Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description  Bicoloring  In 1976 the ``Four Color Map Theorem" was proven with the assistance of a computer. This theorem states that e

【转】计算几何题目推荐

打算转下来好好做计算几何了. 原文地址:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行

ACM知识点清单

本文直接来源http://blog.csdn.net/xuanandting/article/details/52160859,如有侵权,请联系删除. 训练过ACM等程序设计竞赛的人在算法上有较大的优势,这就说明当你编程能力提高之后,主要时间是花在思考算法上,不是花在写程序与debug上. 下面给个计划你练练: 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短路(Fl

[转] POJ几何分类

转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板.如果代码一片混乱,那么会严重影响做题正确率.4.注意精度控制.5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍,或扩大sqrt2).因为整数不用考虑浮点误差,而且运算比浮点快. 一.点

剪辑的楼天城的ACM之路

楼天城楼教主的acm心路历程(剪辑) 利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个回顾.昨天是GCJ2006 的回忆,今天时间上更早一些吧,我现在还清晰记得3 年前,我刚刚参加ACM 时参加北京赛区2005 和杭州赛区2005 的情况.2005 年ACM-ICPC——酸甜苦辣我进入清华大学开始本科学习的时间是2004 年8 月,在进入清华大学的第一年里,由于基础课学习比较紧张,再加上计算机系不允许大一学生自带电脑,我没有参加2004 年的ACM 比赛.不过在

中国大学生编程第一人:楼天城楼教主的acm心路历程

作为acm爱好者,分享下楼教主的故事,作为勉励 利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个回顾.昨天是GCJ2006 的回忆,今天时间上更早一些吧,我现在还清晰记得3 年前,我刚刚参加ACM 时参加北京赛区2005 和杭州赛区2005 的情况.2005 年ACM-ICPC——酸甜苦辣我进入清华大学开始本科学习的时间是2004 年8 月,在进入清华大学的第一年里,由于基础课学习比较紧张,再加上计算机系不允许大一学生自带电脑,我没有参加2004 年的ACM 比

Codeforces 479【E】div3

题目链接:http://codeforces.com/problemset/problem/977/E 题意:就是给你相连边,让你求图内有几个环. 题解:我图论很差,一般都不太会做图论的题.QAQ看官方题解过的.大概就是如果这是一个环的话,每一个点的度数都应该是2才对,根据这个进行dfs做标记. 就算是个简单图论,看到还是会一脸懵逼.QWQ.以后还是会多多写dfs和图论啦.不过个人还是更喜欢数论什么的. 1 #include<iostream> 2 #include<vector>

PAT 甲级 1154 Vertex Coloring

https://pintia.cn/problem-sets/994805342720868352/problems/1071785301894295552 A proper vertex coloring is a labeling of the graph's vertices with colors such that no two vertices sharing the same edge have the same color. A coloring using at most k