首页 > 其他分享 >CodeForces-1276#B 题解

CodeForces-1276#B 题解

时间:2023-10-03 09:33:05浏览次数:43  
标签:return int 题解 路径 CodeForces 1276 vis ret include

正文

这是样例 1 第 1 组数据的图。

让我们观察一下,路径 1->6、1->7、2->6、2->7 是可行的,所以答案为 4。

上述路径中好像点 4 没有贡献?

再看看样例 1 第 2 组数据的图。

发现点 1 和点 4 相互之间存在其他路径,无需经过点 \(a\) 和点 \(b\)。

综上,我们可以知道:在 \(a\) 和 \(b\) 之间的任意路径上的点是不作贡献的。

可以看作 \(a\) 和 \(b\) 之间的路径是一个桥梁,桥梁的两边的点才是做出贡献的,我们将第 1 组数据的图改变一下,可以很清楚地理解。

因此,我们只要找 \(a\)、\(b\) 隔开的点的数量,再将两边数量相乘(乘法原理)即可。

接下来,只要找隔开的点的数量就可以。

考虑 DFS,对 \(a\) 和 \(b\) 分别 DFS。假设从 \(a\) 开始搜,若有一分支搜到 \(b\),则将该分支贡献清零,因为该分支上的点在 \(a\)、\(b\) 之间,没有贡献(既与 \(a\) 相连,也与 \(b\) 相连)。\(b\) 点同理。

那就可以写代码力。

#define by_wanguan
#include<iostream>
#include<vector>
#include<cstring>
#define int long long
const int N=2e5+7;
using namespace std;
int T,n,m,a,b;
vector<int> g[N];
bool vis[N],vis_[N];
inline int dfsb(int x){
  vis[x]=1;
  int ret=1;
  if(x==a) {vis[x]=0; return 0;}
  for(int &i: g[x]){
    if(vis[i]) continue;
    int s=dfsb(i);
    if(s==0&&x!=b) {vis[x]=0; return 0;}
    ret+=s;
  }
  return ret;
}
inline int dfsa(int x){
  vis_[x]=1;
  int ret=1;
  if(x==b) {vis_[x]=0; return 0;}
  for(int &i: g[x]){
    if(vis_[i]) continue;
    int s=dfsa(i);
    if(s==0&&x!=a) {vis_[x]=0; return 0;}
    ret+=s;
  }
  return ret;
}
signed main(){
  ios::sync_with_stdio(false),cin.tie(0);
  cin>>T;
  while(T--){
    cin>>n>>m>>a>>b;
    memset(vis,0,sizeof vis);
    memset(vis_,0,sizeof vis_);
    for(int i=1;i<=n;i++) g[i].clear();
    for(int i=1,a,b;i<=m;i++)
      cin>>a>>b,
      g[a].emplace_back(b),
      g[b].emplace_back(a);
    int aa=dfsa(a)-1,bb=dfsb(b)-1;
    cout<<aa*bb<<'\n';
  }
}

提交记录

标签:return,int,题解,路径,CodeForces,1276,vis,ret,include
From: https://www.cnblogs.com/wanguan/p/17740806.html

相关文章

  • AT_abc279_g [ABC279G] At Most 2 Colors 题解
    题解\(dp[i]\)表示长度为i的格子的合法涂色数,考虑第\(i\)个怎么放第\(i\)个前面\(k-1\)个位置有2种颜色,则第\(i\)个位置只能放这两种颜色中的一种用合法方案减只有一种的方法,即得两种颜色的方案数而只有一种颜色的方案数,等于\(f[i-k+1]\),此时,让中间的\(k-2\)个......
  • P4839 P 哥的桶 题解
    题目大意有\(n\)个桶,\(m\)次操作。在\(pos\)桶中加入一个\(val\)值,求\([l,r]\)中选任意个桶使得异或和最大,求最大的异或和,注意每个节点是一个桶可以放多个值\(n,m≤5×104\)。题目思路单点修改,区间查询,异或最大值很显然是线段树维护线性基然后这样的复杂度是......
  • CF906C题解
    可能更好的阅读体验大家好,我和DP有仇,所以我用猜结论的方法过了这道题。可能是这道题的一个全新思路,可能人自闭久了什么都能想出来(((upd:好像这也是官方题解思路,看来大家做题不太喜欢看CF官方题解(((首先考虑一个问题:如果这是一道构造题,怎么构造一组合法的解?在草稿纸上画了很久......
  • Codeforces Round 730 (Div. 2) B. Customising the Track
    有\(n\)条高速公路,第\(i\)条告诉公路上的车流为\(a_i\)。现在可以执行以下操作任意次:将第\(i\)条高速公路上的一辆车移到第\(j\)条高速公路。需要求最小的\(\sum_{i=1}^{n}\sum_{j=i+1}^{n}|a_i-a_j|\)。不难发现可以构造\(\foralli,j,a_i=a_j\)使任......
  • P2230 Tinux系统 题解
    传送门题目大意:一个\(n\)个叶子节点,一个节点最多可以有\(k\)条边连向子节点,每个节点\(i\)有一个权值\(P_{i}\)。记每个节点子树内点的个数(不包括它自己)为\(son_{i}\),那么每个节点对答案的贡献就是\(son_{i}^2\timesP_{i}\)。特别的,根节点贡献为\(0\),求总贡献。两......
  • P1045 麦森数 题解
    传送门前排提醒:本篇题解没有使用压位和快速幂,运用了一种预处理的思想,希望能提供一种新的思路。首先将\(2^{p}-1(d)\)转换为\(1111…111(b)\)。关于第一问:我们先考虑\(2\)进制转\(8\)进制,将每\(3\)位转为\(1\)位,即每\(\log{8}\)位转为\(1\)位。\(2\)进制转......
  • UVA1471 防线 Defense Lines 题解
    传送门首先可以将题意大概可以简化为:取两端不重复的连续子序列,组成一个最长的连续递增子序列。我们先dp预处理出以\(i\)为结尾的连续递增子序列长度\(dpr_{i}\)。同样预处理出以\(i\)为开头的连续递增子序列长度\(dpl_{i}\)。考虑对于每个\(dpr_{i}\),找到满足\(a_{......
  • P5503 灯塔 题解
    决策单调性二分传送门数据加强版:P3515前置知识:二分,决策单调性首先很容易写出答案式子:\[ans_{i}=\max_{j=i}^{n}{(a_{j}-a_{i}+\lceil\sqrt{\left|i-j\right|}\rceil)}\]先将向上取整符号拆掉,只要在输出时处理就行。再将绝对值符号拆掉,分\(j<i\)和\(j>i\)的情况......
  • Educational Codeforces Round 112 (Rated for Div. 2) A. PizzaForces
    有三种披萨:\(6\)、\(8\)、\(10\)块披萨。制作时间分别需要:\(15\)、\(20\)、\(25\)分钟。现在有\(n\)个人,每人需要一块披萨。询问使所有人能获得披萨的最快时间。观察:发现三种披萨的性价比都一样。(否则按最优性价比贪心)需要让得到的披萨数量\(m\geqn\)。不妨让\(n\)对......
  • 题解 Codeforces Round 901 (Div. 1) / CF1874A~E
    题解CodeforcesRound901(Div.1)/CF1874A~E比赛情况:过了AB。赛后发现B是假复杂度。https://codeforc.es/contest/1874A.JellyfishandGameProblemAlice&Bob又在博弈,Alice手上有\(n\)个苹果,第\(i\)个苹果的价值是\(a_i\);Bob手上有\(m\)个苹果,第\(i\)......