首页 > 其他分享 >洛谷 P6628 [省选联考 2020 B 卷] 丁香之路 做题记录

洛谷 P6628 [省选联考 2020 B 卷] 丁香之路 做题记录

时间:2024-10-24 21:33:28浏览次数:7  
标签:连通 洛谷 bel P6628 read find lst 联考 define

图论好题啊!

首先我们枚举终点 \(u\),看到一定要走完指定的 \(m\) 条边,很像一条欧拉路问题啊!但是现在问题是一个欧拉路问题,有两个点的度数是奇数,并不好做。我们不妨先从起点 \(s\) 向 \(u\) 连一条边,变成欧拉回路问题。现在我们需要做的是将度数为奇数的点加边使其变为偶数。方法是将连续两个度数为奇数的点,中间的任意相邻两点连上一条度数为 \(1\) 的边。因为这样不但连通了更多的节点,代价还和直接连接两点的代价相同,肯定更优。
现在我们的图变成了若干个连通块了,想要使得图连通,我们需要在连通块之间找一条边,让它变成一张连通图,实际上就是一个最小生成树。我们先将连通块缩点,拿相邻的两个点连边,跑一个最小生成树即可。时间复杂度 \(O(n^2 \log n+m)\)。

点击查看代码
#include<bits/stdc++.h>

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define inn(i,n,a) For(i,1,n) a[i]=read();

#define ll long long
#define i128 __int128

using namespace std;
inline int read() {
	int xx= 0;int f= 1;
	char c = getchar();
	while(c<'0'||c>'9') { 
		if(c=='-') f= -1;
		c= getchar();
	}
	while(c>='0'&&c<='9') {
		xx= (xx<<1)+(xx<<3)+(c^48);
		c= getchar();
	}
	return xx*f;
}
#define maxn 200050
int n,m,st;
int deg[maxn];
int res;
int fa[maxn],bel[maxn];
struct node {
	int u,v,d;
	bool operator<(const node x) {return d<x.d; }
};
int find(int x) {return x==fa[x]?fa[x]:fa[x]=find(fa[x]); }
signed main() {
	in3(n,m,st);
	For(i,1,n) fa[i]=i;
	For(i,1,m) {
		int u,v;
		in2(u,v);
		deg[u]++,deg[v]++;
		res+=abs(u-v);
		fa[find(u)]=find(v);
	}
	For(i,1,n) bel[i]=find(i);//先缩一次点
	For(u,1,n) {
		deg[st]++,deg[u]++;
		For(i,1,n) fa[i]=i;
		fa[find(st)]=find(u);
		int ans=res,lst=0;
		For(i,1,n) if(deg[i]%2==1) {
			if(lst) {ans+=i-lst; For(j,lst,i) fa[find(bel[j])]=find(bel[i]); lst=0; }
			else lst=i;
		}
		vector<node>G; lst=0;
		For(i,1,n) if(deg[i]>0) { 
			if(lst&&find(bel[lst])!=find(bel[i])) 
				G.push_back({bel[lst],bel[i],abs(i-lst)});
			lst=i;
		}
		sort(G.begin(),G.end());
		for(auto [x,y,z]:G) 
			if(find(x)!=find(y)) 
				fa[find(x)]=find(y),ans+=2*z;
		cout<<ans<<' ';
		deg[u]--,deg[st]--;
	}
}

标签:连通,洛谷,bel,P6628,read,find,lst,联考,define
From: https://www.cnblogs.com/CodingGoat/p/18501373

相关文章

  • 洛谷 P1002 [NOIP2002 普及组] 过河卒
    你好,我是gwg725。洛谷账号:大号小号欢迎与我讨论。:)题目描述:棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1中的C点和P1,……,P8,卒不能通过......
  • 洛谷 P2680 [NOIP2015 提高组] 运输计划 做题记录
    首先题目要求最大的最小,我们二分答案,对于每个答案,我们筛出比它长的路径,找到它们最长的公共边,删掉后验证正确性即可。找公共边可以用树上差分来做,时间复杂度\(O(m\logn\logV)\),其中\(V\)是二分区间大小。你会发现你挂了一堆点,让我们来卡常:首先预处理出所有节点的\(dfn\),每......
  • 洛谷 P3128 [USACO15DEC] Max Flow P 做题记录
    因为一次添加会对点和边都造成影响,而点一次能加两个,于是最大值一定在点上。由于只有一次询问,考虑树上差分。设一次询问给出的两点为\(x,y\),那么我们在\(x\)和\(y\)处分别加\(1\),在\(\operatorname{lca}(x,y)\)处减\(1\),因为该点本身也有增加,于是我们在它的父节点再减去......
  • 【省选联考2024】季风
    题面题目描述给定\(n,k,x,y\)和\(2n\)个整数\(x_0,y_0,x_1,y_1,\dots,x_{n-1},y_{n-1}\)。找到最小的非负整数\(m\),使得存在\(2m\)个实数\(x_0',y_0',x_1',y_1',\dots,x_{m-1}',y_{m-1}'\)满足以下条件,或报告不存在这样的\(m\):\(\sum\limits_{i=0}^{......
  • 洛谷 P2572 [SCOI2010] 序列操作 做题记录
    其实和小白逛公园差不多,编写代码的难度远大于思路难度,难点是调试:注意在区间异或\(1\)的时候分清代码里的最长连续\(1\)的长度和\(1\)的个数。注意查询最长\(1\)的时候要用结构体上传,如果用到了定值len的话要赋值。注意如果只用一个tag的话,遇到区间异或要对原先......
  • [技巧] 联考策略 2024.10.22
    (2024.10.22;我目前的水平)题目难度&我目前的水平T1:应当较快地做出来。但我目前很可能会在T1上花非常多时间(2h;最近两场考试);甚至做不出T1。T2:应当做出来。思维难度也许比T1低(最近两场考试),但可能还是T1要简单一些(毕竟[机房里T1得分比T2高些](?))。T3:可以尝试写部分分&......
  • 20241022每日一题洛谷P1223
    普及洛谷P1223接水问题有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小第一行为一个整数n,第二行n个整数,第i个整数Ti表示第i个人的接水时间Ti输出两行,第一行为一种平均时间最短的排队顺......
  • 洛谷P3850 [TJOI2007] 书架 splay tree 模板题
    题目链接:https://www.luogu.com.cn/problem/P3850主要操作就是:插入+查询第k值。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1.1e5+5,maxb=20;structNode{ints[2],p,sz;stringname;Node(){}Node(string_n......
  • 洛谷P2596 [ZJOI2006] 书架 题解 splay tree 模板题
    题目链接:https://www.luogu.com.cn/problem/P2596主要涉及的操作就是:找到某一个编号的点(这个操作可以不用splaytree维护)删除某个点将某一个点插入到最前面,最后面,或者某一个位置查询前序遍历为\(k\)的节点编号因为每次删除都会又把这个点加回去,所以可以复用\(n\)个......
  • 洛谷管理员语录(不完整)
    ......