首页 > 其他分享 >最大值(最短路+最短路计数)

最大值(最短路+最短路计数)

时间:2024-07-13 21:53:03浏览次数:13  
标签:cnt vis int 短路 计数 v2 最大值 dis

洛谷CF449B


 

第1题     最大值 查看测评数据信息

给定一个包含n个点和m条边的无向图,以及k条特殊的直接连接节点1的边。每条边都有一个权重,表示两点之间的距离。现在,我们想知道最多可以移除这k条特殊边中的多少条,而保持图中每个节点到节点1的最短距离不变。

 

输入格式

 

第一行n,m,k

接下来m行,每行三个整数x,y,z(x!=y),表示x到y之间有一条边权为z的无向边。

接下来k行,每行两个整数xx和yy,表示节点1到点xx有一条边权为yy的边。

1<=x,y,xx<=n<=1e5,1<=k<=1e5,1<=m<=3e5,1<=z,yy<=1e9

 

输出格式

 

一个整数,表示最多删除的边数。

 

 

输入/输出例子1

输入:

5 5 3

1 2 1

2 3 2

1 3 3

3 4 4

1 5 5

3 5

4 5

5 5

 

输出:

2

 

样例解释

 

 

这题考虑分类讨论。

1.加入的边比最短路大,那就删掉也没事

2.加入的边等于最短路,那得看有几条这种边,留到至少还剩一条才行(此处可用最短路计数)

3.加入的边比最短路小,不可能的情况。舍去

 

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;

int n, m, k, u1, v1, v2[N], w2[N], w1, dis[N], vis[N], cnt[N], ans=0;
struct node
{
	int u, w;
	bool operator <(const node &A) const
	{
		return w>A.w;
	};
};
vector<node> a[N];
priority_queue<node> q;
void dij()
{
	memset(dis, 63, sizeof dis);
	memset(vis, 0, sizeof vis);
	
	dis[1]=0;
	q.push({1, 0});
	
	while (!q.empty())
	{
		int u=q.top().u;
		q.pop();
		
		if (vis[u]) continue;
		vis[u]=1;
		
		for (int i=0; i<a[u].size(); i++)
		{
			int v=a[u][i].u, w=a[u][i].w;
			if (dis[v]==dis[u]+w) cnt[v]++;
			if (dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				cnt[v]=1;
				q.push({v, dis[v]});
			}
		}
	}
}
int main()
{
	scanf("%d%d%d", &n, &m, &k);
	for (int i=1; i<=m; i++)
	{
		scanf("%d%d%d", &u1, &v1, &w1);
		a[u1].push_back({v1, w1});
		a[v1].push_back({u1, w1});
	}
	for (int i=1; i<=k; i++)
	{
		scanf("%d%d", &v2[i], &w2[i]);
		a[1].push_back({v2[i], w2[i]});
		a[v2[i]].push_back({1, w2[i]});
	}
	dij();
//	for (int i=1; i<=n; i++) cout<<cnt[i]<<endl;
	
	for (int i=1; i<=k; i++)
	{
		if (w2[i]>dis[v2[i]]) ans++;
		if (w2[i]==dis[v2[i]] && cnt[v2[i]]>1) ans++, cnt[v2[i]]--;
	}
	printf("%d", ans);
	return 0;
}
/*
5 4 1
1 2 4
2 3 1
3 5 1
4 5 1
3 2


5 5 3
1 2 1
2 3 2
1 3 3
3 4 4
1 5 5
2 1
2 1
2 1
*/ 

  

标签:cnt,vis,int,短路,计数,v2,最大值,dis
From: https://www.cnblogs.com/didiao233/p/18300791

相关文章

  • 24暑假算法刷题 | Day11 | LeetCode 150. 逆波兰表达式求值,239. 滑动窗口最大值,347.
    目录150.逆波兰表达式求值题目描述题解239.滑动窗口最大值题目描述题解347.前K个高频元素题目描述题解150.逆波兰表达式求值点此跳转题目链接题目描述给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个......
  • 最短路问题
    最短路问题writeashortintroduce朴素做法writesomethingCode1Code多源最短路比较好于理解与编写的是Floyd算法。Code2#include<iostream>#include<iomanip>#include<string.h>usingnamespacestd;intn,m;intg[105][105];voidaddedge(intu,intv,int......
  • 【80C51单片机】定时器/计数器的理解
    目录定时器/计数器1.定时器怎么定时简单理解(加1经过了多少时间)什么是时钟周期什么是机器周期2.如何设置定时基本结构相关寄存器1.TMOD寄存器2.TCON寄存器代码示例定时器/计数器80C51单片机的定时器和计数器(TimersandCounters)是其重要的外围设备,用于测量时间......
  • 【Mutilism用74ls192和与非门设计3进制24进制加法计数器2荔枝】2022-5-10
    缘由【数电数字逻辑】如何用74ls192和与非门设计任意进制加法计数器?-嵌入式-CSDN问答 ......
  • BFS:边权相同的最短路问题
    一、边权相同最短路问题简介二、迷宫中离入口最近的出口.-力扣(LeetCode)classSolution{public:constintdx[4]={1,-1,0,0};constintdy[4]={0,0,1,-1};intnearestExit(vector<vector<char>>&maze,vector<int>&e){intm=maze.size(),n=......
  • C#+OpenCV实战(三)_玉米粒计数
    ///<summary>///标注物体-物体计数标注///比如玉米粒计数并标注每个玉米///</summary>///<paramname="imgFile1"></param>///<returns>物体位置;数量=contours.Length</returns>publicstaticPoint[][]ImageDetector_CountAndLabel(MatsrcMa......
  • CF1770F Koxia and Sequence(条件统计转组合数计数)
    题意简述给定\(n,x,y\),定义序列\(\{a_n\}\)合法当且仅当\(\sum_{i=1}^na_i=x\)且\(\operatorname{or}_{i=1}^n=y\),你需要求出\(\oplus_{a\\text{is}\\text{valid}}\oplus_{i=1}^na_i\)的值。\(n<2^{40},x<2^{60},y<2^{20}\)。分析第一步:先做一波非常重要的分析答......
  • Day 10 逆波兰表达式求值,滑动窗口的最大值,前k个高频词
    逆波兰表达式求值逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。#include<iostream>usingnamespacestd;#include<stack>strings;intmain(){ strings; cin>>s; stack<int>u; for(inti=0;i<s.size();i++) { if(s[i]=='+'|......
  • 【C语言】学习笔记:找出一个二维数组中的最大值,并打印出该最大值及其在数组中的位置
    找出一个二维数组中的最大值,并打印出该最大值及其在数组中的位置。首先,定义了必要的变量,包括用于遍历数组的索引变量i和j,以及用于存储最大值及其位置的变量hang、lie和max。定义了一个名为arry的二维数组,并初始化了其元素。使用两个嵌套的for循环来遍历数组,并......
  • 单源最短路
    ABC340DSuperTakahashiBros.问题描述高桥正在玩一个游戏。这个游戏由编号为\(1,2,\ldots,N\)的\(N\)个阶段组成。最初,只有阶段\(1\)是可以玩的。对于每个可以玩的阶段\(i\)(其中\(1\leqi\leqN-1\)),在阶段\(i\)你可以执行以下两个动作之一:花费\(A_i\)秒来通过阶段\(i......