首页 > 其他分享 >CF543B Destroying Roads

CF543B Destroying Roads

时间:2023-10-18 20:24:03浏览次数:39  
标签:typedef Destroying define long CF543B int Roads include dis

好经典的题,因为暑假前集训做过类似的思想的题所以知道怎么处理

这题由于要求最多的删去的边数,则等价于求最少保留几条边,很显然留下的边一定是最短路上的

但问题是如果两条路不相交的话很简单,可事实是两条路径可以重叠一些部分,这些边用了两次可能可以使答案变优

关于这种图上两条路径的题有一个经典结论,即两条路径至多相交一次

具体地,我们可以枚举两条路径的重复部分\(x,y\),则最后两条路径分别为\(s_1\to x\to y\to t_1,s_2\to x\to y\to t_2\)(当然具体的顺序可以换一下)

预处理出任意两点的最短路后就很简单了,总复杂度\(O(n^2)\)

#include<cstdio>
#include<iostream>
#include<utility>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<set>
#include<array>
#include<random>
#include<bitset>
#include<ctime>
#include<limits.h>
#include<assert.h>
#include<unordered_set>
#include<unordered_map>
#define RI register int
#define CI const int&
#define mp make_pair
#define fi first
#define se second
#define Tp template <typename T>
using namespace std;
typedef long long LL;
typedef long double LDB;
typedef unsigned long long u64;
typedef __int128 i128;
typedef pair <int,int> pi;
typedef vector <int> VI;
typedef array <int,3> tri;
const int N=3005,INF=1e9;
int n,m,x,y,s1,t1,l1,s2,t2,l2,dis[N][N]; vector <int> v[N];
inline void BFS(CI st,int* d)
{
	for (RI i=1;i<=n;++i) d[i]=INF;
	queue <int> q; q.push(st); d[st]=0;
	while (!q.empty())
	{
		int now=q.front(); q.pop();
		for (auto to:v[now]) if (d[to]>d[now]+1)
		d[to]=d[now]+1,q.push(to);
	}
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	RI i,j; for (scanf("%d%d",&n,&m),i=1;i<=m;++i)
	scanf("%d%d",&x,&y),v[x].push_back(y),v[y].push_back(x);
	for (i=1;i<=n;++i) BFS(i,dis[i]);
	scanf("%d%d%d%d%d%d",&s1,&t1,&l1,&s2,&t2,&l2);
	if (dis[s1][t1]>l1||dis[s2][t2]>l2) return puts("-1"),0;
	int ans=dis[s1][t1]+dis[s2][t2];
	auto Dis=[&](CI s,CI t)
	{
		return min(dis[s][i]+dis[j][t],dis[s][j]+dis[i][t])+dis[i][j];
	};
	for (i=1;i<=n;++i) for (j=1;j<=n;++j)
	if (Dis(s1,t1)<=l1&&Dis(s2,t2)<=l2)
	ans=min(ans,Dis(s1,t1)+Dis(s2,t2)-dis[i][j]);
	return printf("%d",m-ans),0;
}

标签:typedef,Destroying,define,long,CF543B,int,Roads,include,dis
From: https://www.cnblogs.com/cjjsb/p/17773242.html

相关文章

  • CF1149D Abandoning Roads
    首先\(a\)边可以随便选。显然,若某条\(b\)边的两端位于同一\(a\)连通块,一定不会被我们考虑。剩下的\(b\)边一定会将两个\(a\)连通块相连。那么此时我们对于\(b\)边的约束是,位于一个环上的\(b\)边不能同时存在图中,即,我们的路径不能从当前连通块出发,经过至少一条\(b......
  • CodeForces 1149D Abandoning Roads
    洛谷传送门CF传送门考虑一条\(1\toi\)的路径是否在最小生成树上。称边权为\(a\)的边为轻边,边权为\(b\)的边为重边。轻边若不成环则一定在最小生成树上,因此先把轻边合并,这样形成了若干连通块。那么如果两点在一个连通块,它们只能通过轻边互达。同时,因为是树上路径,所......
  • CF671D Roads in Yusland
    1D8ya。设\(f_{u,i}\)表示覆盖了\(u\)子树并且向上覆盖到了深度为\(i\)的最小代价。考虑合并儿子\(v\):\[f'_{u,i}\gets\min\left(f_{u,i}+\min\limits_{j=1}^nf_{v,j},f_{v,i}+\min\limits_{j=1}^nf_{u,j}\right)\]相当于区间加,单点取\(\min\),区间求最小值。直接......
  • Roads in the North POJ - 2631 - 树的直径/树形dp
    题意:给出一棵无向树,求树的直径,即树上两点之间的最长距离分析:两种解法解法1:先任取一个点,找到距离该点最远的点u,再找到距离u最远的点v,那么u和v之间的路径就是一条直径。证明:只要找到了树的直径的一个端点,再从该点找到最远点就一定是直径的另一个端点。所以只需要证明第一次找到的......
  • CF671D Roads in Yusland 题解
    题目链接题目要求我们求出选出若干条路径并最小化花费,如果这是在链上,我们可以考虑直接枚举每条路径的右端点dp,那树呢?把路径剖分整个覆盖的集合就不一定连续了,没法dp,况且题目里给了很强的条件:路径一定是从孩子到祖先,硬转链用不上这个性质,貌似不太对。上述思考启发我们利用树的......
  • Constructing Roads
    ConstructingRoadsTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):17199    AcceptedSubmission(s):6529ProblemDescriptionThereareNvillages,whicharenumberedfrom1toN,andyou......
  • P3008 [USACO11JAN]Roads and Planes G
    P3008[USACO11JAN]RoadsandPlanesG思路按照分连通块的方法进行计算,并且如果不是本连通块的点,不能在现在的本次dfs中求解最小值。要一个一个的联通快进行标记。/*不能直接走disj的话,缩点的思想很重要首先尽量不要使用spfa进行走图,可能会卡对道路进行求连通块,对航线求度数......
  • Codeforces Round #Pi (Div. 2) E. President and Roads (最短路+强连通求割边)
    题目地址:codeforces#pi(DIV2)E题目很水。。就是先求两边最短路,然后把可能为最短路的边挑出来,然后判断是否yes只需要转化成无向图跑一遍tarjan,找出割边,割边就是yes,然后剩下的边就让它的值为最短路-1就行了,如果-1后变成了非正数,就是no.但是!!!居然卡spfa!!那是不是说cf以后就不......
  • UVa 11723 Numbering Roads (water ver.)
    11723-NumberingRoadsTimelimit:1.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2823Inmycountry,streetsdon’thavenames,eachofthemarejustgivenanumber......
  • CF-25C - Roads in Berland(水题)
    C-RoadsinBerlandCrawlinginprocess...CrawlingfailedTimeLimit:2000MSMemoryLimit:262144KB64bitIOFormat:%I64d&%I64u​​Submit​​​......