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

P6134 [JSOI2015]最小表示

时间:2023-04-16 18:34:03浏览次数:50  
标签:std head JSOI2015 idx int 最小 P6134

P6134 [JSOI2015]最小表示

思:

有向无环图,想到拓扑排序。

逆序枚举,因为排序后下标小的点用到它前面的点的联通性。

对其连接的点按照拓扑序由小到大进行排序(靠前的点可以连接的点多,那么可以删的边数也变多。

其余套路与可达性统计类似,注意代码细节。

#include <bits/stdc++.h>

#define cin std::cin
#define cout std::cout
#define endl std::endl

namespace lcj{
const int N=3e4+10,M=1e5+10; 
int n,m,head[N],ne[M],e[M],idx,topo[N],deg[N],cnt,ans;//空间不要忘记开大点,有1e5次输入。
std::bitset<N> f[N]; 
std::queue<int> q;
std::unordered_map<int,int> mp;//哈希映射,点对应的拓扑序(dist的下标)。
void add(int x,int y){
	e[++idx]=y;
	ne[idx]=head[x];
	head[x]=idx;
}
bool cmp(int a,int b){
	return mp[a]<mp[b];
}
void main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		deg[y]++;
	}
	for(int i=1;i<=n;i++){
		if(!deg[i]) q.push(i);
	}
	while(!q.empty()){
		int h=q.front();
		q.pop();topo[++cnt]=h;mp[h]=cnt;
		for(int i=head[h];i;i=ne[i]){
			int v=e[i];
			deg[v]--;
			if(!deg[v]) q.push(v);
		}
	}
	for(int i=cnt;i;i--){//注意逆序
		int v=topo[i];
		f[v].reset();f[v][v]=1;
		int a[N],len=0;
		for(int j=head[v];j;j=ne[j]){
			a[len++]=e[j];//可以联通的点存入数组
		}
		std::sort(a,a+len,cmp);//按照拓扑序排序,拓扑序小(下标)的放前面
		for(int j=0;j<len;j++){
			if(f[v][a[j]]) ans++;//如果可以通过别的点联通,可以删去。
			else f[v] |= f[a[j]];//更新联通性
		}
	}
	printf("%d",ans);
}
}
signed main(){
	lcj::main();
	return 0;
}

标签:std,head,JSOI2015,idx,int,最小,P6134
From: https://www.cnblogs.com/lcj-blogs/p/17323789.html

相关文章

  • 最小生成树学习笔记
    定义最小生成树是指给定一个带权连通图G,如果里面有一个子图G'中的边权和加起来最小并且使得所有的点都能两两相通。性质从上述的定义可以看出,最小生成树有以下性质:如果图G中有n个点的话,G'中的边数为n-1且G'中不含有环。最小生成树可能是一个,也可能是多个。......
  • 【230415-2】已知:a+b=4(a>0,b>0) 求:根号下(a^2+1)+根号下(b^2+1)的最小值?
    ......
  • #yyds干货盘点# LeetCode面试题:最小覆盖子串
    1.简述:给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。 注意:对于t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。如果s中存在这样的子串,我们保证它是唯一的答案。......
  • LeetCode 周赛 340,质数 / 前缀和 / 极大化最小值 / 最短路 / 平衡二叉树
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周跟大家讲到小彭文章风格的问题,和一些朋友聊过以后,至少在算法题解方面确定了小彭的风格。虽然竞赛算法题的文章受众非常小,但却有很多像我一样的初学者,他们有兴趣参加但容易被题目难......
  • 最小包装量
    ///<summary>///计算最小包装数量///</summary>///<paramname="qty">订单数量</param>///<paramname="minPackagingQty">最小包装数量</param>///<returns></returns&g......
  • Codeforces Round #303 (Div. 2) E. Paths and Trees (最短路+变形最小生成树)
    题目地址:E.PathsandTrees模拟了一场CF,这场实在太水了。。边玩边做的。。最后半分钟交了一发E题。。不幸AK绝杀失败。。。。首先的思路肯定是先求最短路,把可能为最短路的边挑出来,然后第二步我本来写的是直接用无向图的最小生成树,于是绝杀失败。。。后来才发现这样是不行的。......
  • 力扣:153. 寻找旋转排序数组中的最小值
    已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次的结果为数......
  • MFC-IsIconic判断窗口是否最小化
     HWNDhWnd=NULL;UINTfunc1(LPVOIDpParam)//线程函数{BOOLbb;for(inti=0;i<1000;i++){bb=IsIconic(hWnd);//判断窗口是否最小化/*参数1:HWNDhWnd窗口句柄返回值:已经最小化返回TRUE,......
  • 20230410 训练记录:最小瓶颈路 / lca
    初识最小瓶颈路其实是上海那道著名的铜牌题,其次就是P1396营救。P1967[NOIP2013提高组]货车运输/最小瓶颈路https://www.luogu.com.cn/problem/P1967\(\mathcalO(m\logm+(n+q)\logn)\)最大生成树(森林)两点间最小边权,直接在倍增lca向上爬的时候更新答案。问......
  • GridSplitter使用,包括最大最小限制
     <Windowx:Class="WpfApp1.PageWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:ribbon="clr-namespace:Mic......