首页 > 其他分享 >根据合法性边的权值视为0/1

根据合法性边的权值视为0/1

时间:2024-03-08 21:00:48浏览次数:23  
标签:合法性 dist idx int 视为 mid 权值 include

题目链接
思路:二分枚举答案 + \(dijkstra\) 验证答案
二分枚举答案 \(mid\),通过 \(dijkstra\) 求最短路,将需要升级的边的权值看作 \(1\),不需要升级的边的权值看作 \(0\),这样求得的最小值就是需要升级的次数
这个将边权值根据需要设置为 \(0/1\) 的技巧需要注意

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

const int N = 1010, M = 20010;

int n, m, k;
int h[N], e[M], w[M], ne[M], idx;
int dist[N];
bool st[N];

typedef pair<int, int> PII;

void add(int a, int b, int c) 
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}


bool dijkstra(int mid)
{
    memset(dist, 0x3f, sizeof dist);
    memset(st, false, sizeof st);
    dist[1] = 0;
    
    priority_queue<PII, vector<PII>, greater<PII>> q;
    q.push({0, 1});
    while(q.size())
    {
        auto [distance, ver] = q.top(); q.pop();
        if(st[ver]) continue;
        st[ver] = true;
        for(int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            int flag = w[i] > mid; // 修改边权,若s[i]<=mid,边权为0,反之为1
            if(dist[j] > distance + flag)
            {
                dist[j] = distance + flag;
                q.push({dist[j], j});
            }
        }
    }
    return dist[n] <= k;
}

int main()
{
    memset(h, -1, sizeof h);
    cin >> n >> m >> k;
    int l = 0, r = 0;
    while (m -- )
    {
        int a, b, c;    cin >> a >> b >> c;
        add(a, b, c);   add(b, a, c);
        r = max(r, c);
    }
    int maxn = ++ r;  // r+1 为不合法的,表示n不可达
    while(l < r)
    {
        int mid = l + r >> 1;
        if(dijkstra(mid))   r = mid;
        else    l = mid + 1;
    }
    cout << (l == maxn ? -1 : l) << endl;
    return 0;
}

标签:合法性,dist,idx,int,视为,mid,权值,include
From: https://www.cnblogs.com/ALaterStart/p/18061851

相关文章

  • P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值
    做这道题的时候混淆了满二叉树和完全二叉树的概念:满二叉树:顾名思义,就是塞满了完全二叉树:除了最后一层之外,每一层都必须是满的,且最后一层如果不满,则所有节点都尽可能靠左。#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#defineFor(i,j,n......
  • 【认证】验证确认实体的身份真实性、合法性
     认证是确认某个实体(如个人、设备或数据)的身份真实性和合法性的过程。在身份验证中,个人必须提供一些证据或信息(密钥)来证明他们所声称的身份是正确的。 签名与验证是数字认证的一种常见方式。在这种情况下,使用加密算法生成一个数字签名,并将其附加到数据上。数字签名可以确保数......
  • 权值树状数组例题——逆序对
    目录问题引入思路一览具体情况code部分补充问题引入(洛谷P1908)[https://www.luogu.com.cn/problem/P1908],简单来说就是给一个数列,求出逆序对的数量思路一览BF做法:遍历数组中的每一个数,对于每一个数,再次遍历前面的数,时间复杂度是n2归并排序:这个...,不太了解,以后明白了再填坑......
  • 题解 NOIP2014 提高组-联合权值
    题解NOIP2014提高组-联合权值基本思路:以每个点为中转点,则与之相邻的点组成的点对都可产生联合权值,并且全覆盖。主要总结一下两种求权值和的思路:思路1(容斥):记与\(u\)相邻的点的集合为\(A\),则点\(u\)产生的贡献为\[ans_u=(\sum_{v\inA}w_i)^2-\sum_{v\inA}w_v\times......
  • 【学习笔记】权值线段树
    一.权值线段树权值线段树即一种线段树,以序列的数值为下标。节点里所统计的值为节点所对应的区间\([l,r]\)中,\([l,r]\)这个值域中所有数的出现次数。举个例子,有一个长度为\(10\)的序列\(\{1,5,2,3,4,1,3,4,4,4\}\)。那么统计每个数出现的次数。易知\(1\)出现了\(2\)......
  • 最高院--工程结算单中当事人仅有盖章没有签字的,应视为同意该数额,如一方否认该结算单为
    (2020)最高法民终1147号  青海豪都华庭房地产开发有限公司与中天建设集团有限公司建设工程施工合同纠纷案本院认为:关于案涉工程造价问题。《最高人民法院关于审理建设工程施工合同纠纷案件适用法律问题的解释(二)》第十二条规定:“当事人在诉讼前已经对建设工程价款结算达成协议,......
  • 最高法--结算协议中含有非工程款性质但与最终清算值密切相关的项目的,除另有相关证据表
    (2021)最高法民申7402号  天津北方华泰置业投资有限公司、中冶天工集团有限公司等建设工程施工合同纠纷民事申请再审审查民事裁定书申请人主张:华泰公司申请再审称,(一)原判决认定的基本事实缺乏证据证明。尽管华泰公司与中冶公司已经对审计机构出具的审计金额152655857.00元予以确......
  • 最高法-1. 挂靠关系下挂靠人向被挂靠人主张挂靠费用的,不予支持;2. 在相对人不知晓挂靠
    (2020)最高法民终576号  河南东方建设集团发展有限公司、黄建国建设工程施工合同纠纷二审民事判决书【经典判例】上诉人主张:【东方公司】(一)黄建国系东方公司内部工作人员,东方公司一直为其正常缴纳社会保险。《工程施工内部承包协议书》是东方公司与黄建国之间签订的独立合同,东......
  • Codeforces Round 918 (Div. 4) (前缀和,权值树状数组,二维偏序, python + golang)
    Dashboard-CodeforcesRound918(Div.4)-Codeforces  fromcollectionsimport*defsolve():a,b,c=list(map(int,input().split()))hs=defaultdict(int)hs[a]+=1hs[b]+=1hs[c]+=1foriinhs:ifhs[i]=......
  • 最高法--票据权利时效均系可中断时间,对票据时效起诉后再撤诉也应当视为中断。
    1.(2022)最高法民申727号  陕西能源凉水井矿业有限责任公司、陕西华山创业有限公司等票据追索权纠纷民事申请再审审查民事裁定书申请人主张:凉水井公司、华山创业公司、陕西能源公司依据《中华人民共和国民事诉讼法》第二百零七条规定申请再审,请求:1.裁定中止本案原审判决执行;2.撤销......