首页 > 其他分享 >[JSOI2015]最小表示

[JSOI2015]最小表示

时间:2022-12-14 21:44:25浏览次数:73  
标签:表示 nxt JSOI2015 int 最小 len 条数 edge 这道题

链接:https://www.luogu.com.cn/problem/P6134

题目描述:给定一个\(DAG\),求最多删多条边能使任意两点的连通性不会发生改变。

题解:手玩几组数据可以发现答案就是图中去掉边\((u,v)\)后\(u,v\)仍能连通的边的条数。然后这道题就变成了求对于每一条边,\((u,v)\)的路径条数是否大于等于\(2\)。

我们可以发现,如果将这道题稍微弱化以下,就变成了在\(DAG\)上给定\(q\)组点对\((u,v)\),求\(u\)是否能到达\(v\)。我们知道这道题就是有向图可达性统计那一套,所以这道题至少要用到\(bitset\)。

判断大于\(2\)不怎么好直接做,那我们可以考虑维护两个\(bitset\):\(A\)与\(B\),其中\(A\)维护路径条数大于等于\(1\)的,\(B\)维护路径条数大于等于\(2\)的,更新\(B\)时与\(A\)做一下与运算就可以求出\(B\)了。

#include<iostream>
#include<bitset>
#include<queue>
using namespace std;
struct node
{
	int v,nxt;
};
node edge[100001];
int n,m,cnt,len,in[100001],head[100001];
bitset<30001>A[30001];
bitset<30001>B[30001]; 
void add(int x,int y)
{
	edge[++len].v=y;
	edge[len].nxt=head[x];
	head[x]=len;
	return;
}
void top_sort()
{
	queue<int>q;
	for (int i=1;i<=n;++i)
		if (in[i]==0)
			q.push(i);
	int top;
	while (!q.empty())
	{
		top=q.front();
		q.pop();
		for (int i=head[top];i>0;i=edge[i].nxt)
		{
			in[edge[i].v]--;
			B[edge[i].v]|=(A[edge[i].v]&A[top]);
			A[edge[i].v]|=A[top];
			if (in[edge[i].v]==0)
				q.push(edge[i].v);
		}
	}
	return;
}
int main()
{
	int x,y;
	cin>>n>>m;
	for (int i=1;i<=m;++i)
	{
		cin>>x>>y;
		add(x,y);
		in[y]++;
	}
	for (int i=1;i<=n;++i)
		A[i][i]=1;
	top_sort();
	for (int i=1;i<=n;++i)
		for (int j=head[i];j>0;j=edge[j].nxt)
			if (B[edge[j].v][i]==1)
				cnt++;
	cout<<cnt<<endl;
	return 0; 
}

标签:表示,nxt,JSOI2015,int,最小,len,条数,edge,这道题
From: https://www.cnblogs.com/zhouhuanyi/p/16983674.html

相关文章

  • [JSOI2015]最大公约数
    链接:https://www.luogu.com.cn/problem/P5502题目描述:对于一个序列$a$,求$\sum_{i=l}^{r}gcd(a_{l},....,a_r)\times(r-l+1)$的最大值。题解:利用"签到游戏"的知识,我们......
  • [JSOI2015]symmetry
    链接:https://www.luogu.com.cn/problem/P6083题目描述:这个题则么这么卡常。我们可以先想到一个$O(n^3)$的$dp$,令$dp_{i,j,k}$表示以$(i,j)$为左上角边长为$k$的正方形......
  • 【算法实践】| 一步步手把手带你实现寻找最小公倍数
    前言其实最小公倍数的概念和计算最小公倍数的方法.那是我们在学习小学数学的时候就已经掌握的数学知识,为了更加通俗易懂一点,本文先从一个'分元宝'的故事入手:亡故的先父留......
  • NLP《词汇表示方法(三)word2vec》
    Word2Vec是2013年Google发布的工具,也可以说是一个产生词向量的一群模型组合,关于词向量,也就是嵌入词向量的解释之前也解释了,这里不赘述。该工具主要包含两个词向量的生成模型......
  • 表示数值的字符串
    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.......
  • python从中文数字数据区间提取minmax最小值、最大值返回pandas
    先上结果:定义转换函数代码:defrange2min(text):if'千'intext:text=text.replace('千','000')#替换中文为数字if'万'intext:text=tex......
  • 博 客 测 试 --> P3366【模板】最小生成树
    P3366【模板】最小生成树题目描述如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz。输入格式第一行包含两个整数N,M,表示该图共有N个结点和M条无向边。......
  • 2190. 有源汇上下界最小流
    2190.有源汇上下界最小流和最大流差不多首先是判断可行吗最后要把起点和终点调换,然后减去#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongcon......
  • 旋转数组的最小数字
    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组的最小元素。例如数组 {3,4,5,1,2}{3,4,5,1,2} 为 {1,......
  • 力扣---746. 使用最小花费爬楼梯
    给你一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为0或下标为1的......