#1 DeBug日志

我好难过~ 这不是我要的那种~ 结果~ 结果~~~

DeBug日志 luogu P1967 货车运输

我是从哪里学会的

\(crazydave\) 的题解

题目描述

$A $国有 \(n\) 座城市,编号从 \(1\)到\(n\),城市之间有 \(m\)条双向道路。每一条道路对车辆都有重量限制,简称限重。

现在有 \(q\)辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。

输入

第一行有两个用一个空格隔开的整数 \(n, m\),表示\(A\)国有\(n\)座城市和\(m\)条道路。

接下来\(m\)行每行三个整数\(x,y,z\),每两个整数之间用一个空格隔开,表示从\(x\)号城市到\(y\)号城市有一条限重为\(z\)的道路。

注意: \(x≠y\),两座城市之间可能有多条道路。

接下来一行有一个整数\(q\),表示有\(q\)辆货车需要运货。

接下来\(q\)行,每行两个整数\(x, y\),之间用一个空格隔开,表示一辆货车需要从\(x\)城市运输货物到\(y\)城市,保证\(x≠y\)。

输出

共有 \(q\) 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。

如果货车不能到达目的地,输出 \(?1\)。

样例

\(in\)

4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3

\(out\)

3
-1
3

思路

最大生成树+LCA,这个题整体难度就在于代码的实现,因为这两种算法本身比较容易实现,可是放到一块,事情就没那么简单了。以下是程序实现。

首先建立两个图,一个图是输入的图,另一个是kruskal算法生成的图。我们要在第二个图上面进行倍增,所以后面的f[ ][ ],v[ ][ ],dep[ ]数组记录的就是第二个图的倍增信息。另外,fa[ ]记录的是并查集的数组,表述的也是第二个图的并查集关系。

写代码时翻车出现在了LCA的掌握不准确,和两个图标识搞乱这两个问题上。

我的代码

(后面有debug的记录)

// 曹宇琮
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define INF 999999999
using namespace std;
int n,m;
int fa[6000000][30];
int v[6000000][30];
bool vis[6000000];
int dep[6000000];
struct EDGE{
    int from,to,v;
    int nxt;
}edge[100005],edgein[60006];
int cnt1 = 0,cnt2 = 0;
int head[6000000];
void add_tree_edge(int from,int to,int v){
    cnt2++;
    edge[cnt2].from = from;
    edge[cnt2].to = to;
    edge[cnt2].v = v;
    edge[cnt2].nxt = head[from];
    head[from] = cnt2;
}

int f[6000000];
int getfa(int x){
    return f[x] == x ? x : f[x] = getfa(f[x]);
}

bool cmp(EDGE x,EDGE y){
    return x.v > y.v;
}

void kruskal(){
    sort(edgein + 1 , edgein + 1 + m, cmp);
    for(int i = 1;i <= n; i++)
        f[i] = i;
    for(int i = 1;i <= m; i++){
        int x = edgein[i].from,y = edgein[i].to;
        if(getfa(x) != getfa(y)){
            f[getfa(x)] = getfa(y);
            add_tree_edge(x,y,edgein[i].v);
            add_tree_edge(y,x,edgein[i].v);//这里是最终错的地方(原来写的edge[i].v)
        }
    }
}

void dfs(int x){
    vis[x] = 1;
    for(int i = head[x];i;i = edge[i].nxt){
        if(!vis[edge[i].to]){
            int y = edge[i].to;
            fa[y][0] = x;
            dep[y] = dep[x] + 1;
            v[y][0] = edge[i].v;
            dfs(y);
        }
    }
}

int lca(int x,int y){
    if(getfa(x) != getfa(y))
        return -1;
    int ans = INF;
    if(dep[x] > dep[y]) swap(x,y);
    for(int i = 20;i >= 0; i--)
        if(dep[fa[y][i]] >= dep[x]){//①
            ans = min(ans,v[y][i]);
            y = fa[y][i];//②
        }
    if(x == y){return ans;}
    for(int i = 20;i >= 0; i--){
        if(fa[y][i] != fa[x][i]){
            ans = min(ans,min(v[y][i],v[x][i]));
            x = fa[x][i];
            y = fa[y][i];
        }
    }
    ans = min(ans,min(v[x][0],v[y][0]));
    return ans;
}

int main(){
    cin >> n >> m;
    for(int i = 1;i <= m; i++){
        int x,y,z;
        cin >> x >> y >> z;
        edgein[i].from = x;
        edgein[i].to = y;
        edgein[i].v = z;
    }
    kruskal();

    for(int i = 1;i <= n; i++){
        if(!vis[i]){
            dep[i] = 1;
            dfs(i);
            fa[i][0] = i;
            v[i][0] = INF;
        }
    }

    // for(int i = 0;i <= n; i++){
    //     for(int j = 0;j <= 20; j++){
    //         cout << v[i][j] << ‘ ‘;
    //     }
    //     cout << endl;
    // }

    for(int i = 1;i <= 20; i++){
        for(int j = 1;j <= n; j++){
            fa[j][i] = fa[fa[j][i-1]][i-1];
            v[j][i] = min(v[j][i-1],v[fa[j][i-1]][i-1]);
        }
    }

    int q;
    cin >> q;
    for(int i = 1;i <= q; i++){
        int x,y;
        cin >> x >> y;
        cout << lca(x,y) << endl;
    }
    return 0;
}

① 这里一开始写的是fa[y] >= dep[x],没有考虑到我们用该看他移动以后位置如何

② 这里一开始把if里面的顺序写反了,记成了移动以后的v[y][i]值。

行吧这个题我调了好久才调出来。重新写一遍去。白白。

原文地址:https://www.cnblogs.com/Cao-Yucong/p/12562675.html

时间: 2024-10-24 09:44:14

#1 DeBug日志的相关文章

(Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译

Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目,选择类库,取名为JefferyChan,具体步骤如下图: 3.因为要调用Unity中的相关文件,所以这里要引入外部文件.首先在Unity的安装文件夹中找到UnityEngine.dll,我的路径是:D:\Program Files (x86)\Unity\Editor\Data\Managed 如

logback debug 日志没有信息

可能是项目绑定的日志不是logback的jar包,而是其他包,具体可查看tomcat启动日志 log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2

#2 DeBug日志

YBT P1243 GeBug日志 题目 [题目描述] 输入n个数,从小到大将它们输出,重复的数只输出一次.保证不同的数不超过500个. [输入] 第一行是一个整数n.1≤n≤100000. 之后n行,每行一个整数.整数大小在int范围内. [输出] 一行,从小到大不重复地输出这些数,相邻两个数之间用单个空格隔开. [样例] 7 5 100 400 300 100 500 101 400 500 代码 int a[100099],m,n; bool cmp(int x){ int ans = 1

log4net 打开自身的debug日志

log4net自身启用debug 1.设置启用参数: <appSettings> <add key="log4net.Internal.Debug" value="true "/> </appSettings> 2.设置启用路径: <system.diagnostics> <trace autoflush="true"   > <listeners> <add name

解决mybatis3.2.8和log4j2整合打印sql debug日志的问题

框架:Spring4.1.5+mybatis3.2.8+log4j2+... 问题描述:使用service调用dao进行数据库操作时,发现mybatis没有打印日志,对开发调试非常不方便. 解决:在mybatis-config.xml添加: <configuration>      <settings>          <setting name="logImpl" value="LOG4J2" />      </set

php 打印debug日志

A lesser known trick is that mod_php maps stderr to the Apache log. And, there is a stream for that, so file_put_contents('php://stderr', print_r($foo, TRUE)); will nicely dump the value of $foo into the Apache error log. 转自: http://stackoverflow.com

debug日志1(python)

1.     Python中向文件中写入内容的时候如果想每写一个就输入一个回车,做法是:f.write(str + '\n').\n 是要加引号的,写入的时候unix系统会直接写\n, win系统会自动替换为\r\n.如果在此处写入'\r\n',则windows上这里相当于回车加上再空一行. 2.     在windows操作系统上一定要注意'\'才是转义字符,'/'是除,'//'是取余. 3.     Python中range()的三个参数分别是起始元素,终止值,步长.但是终止值是不包括在里面

debug日志2(python)

1.      写正则表达式时,为什么要加上re.S Make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline. 2.    正则匹配中search,match,findall的差别 match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个st

DNS的视图功能以及日志系统

实验环境:RHEL5.8 32Bit DNS的视图功能以及日志系统详解 DNS的主配置文件中的allow-recursion参数用来定义能够和DNS服务器进行递归的客户端来源,allow-query参数用来定义允许到DNS服务器上面发起查询请求的客户端,allow-transfer参数用来定义允许和DNS服务器进行区域传送的客户端,区域传送主要有两种方式,axfr和ixfr,使用dig命令也可以模拟实现区域传送: 如果我们的DNS服务器允许进行递归.发起查询请求以及进行区域传送的客户端比较多的话