8.29T3 嘉心糖(很稠密的二分图匹配、最大团、偏序传递闭包、最长反链、最小链覆盖、拆点二分图匹配、网络流、模拟网络流)

http://cplusoj.com/d/senior/p/NODSX2303C

我以前写的半篇题解:https://blog.youkuaiyun.com/zhangtingxiqwq/article/details/135612739

我们现在要求一个 n n n 个点 m m m 条边的图的最大团,等价于求补图的最大独立集。

由于补图满足偏序关系,等价于求它的最长反链,也就是最小链覆盖。直接拆点二分图,可以获得65分。

考虑这个满足偏序关系的二分图只有 m m m 条边不存在,非常稠密,因此我们可以模拟二分图匹配。

首先对于每个点补图中不存在的出边(也就是原图中的边)排序。

我们从后往前贪心找能匹配的最大值, 这部分可以用并查集+双指针搞定。

然后此时我们跑出来的答案和最终答案相差不超过 m \sqrt m m ,而最终答案也最多有 m \sqrt m m 个未匹配,因此此时我们左部为匹配的点的个数是 m \sqrt m m 级别的。

我们考虑模拟匈牙利算法的过程,只不过我们把dfs换成bfs,队列维护左部点。我们现在就是要快速在右部点中找出未vis,且当前点存在出边的点。

而这个东西我们直接对右边为visit的点暴力维护即可。因此如果我们visit成功,那么未visit的点个数-1,如果visit失败,说明我们肯定通过了原图上的一条边(也就是补图上不存在的边)。而原图只有 m \sqrt m m 条边。所以单次bfs的过程复杂度是 n + m n+m n+m

总复杂度 O ( m ( n + m ) ) O(\sqrt m(n+m)) O(m (n+m)),不能带log

#include<bits/stdc++.h>
using namespace std;
#ifdef LOCALd
 #define debug(...) fprintf(stdout, ##__VA_ARGS__)
 #define debag(...) fprintf(stderr, ##__VA_ARGS__)
#else
 #define debug(...) void(0)
 #define debag(...) void(0)
#endif
//#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
#define fi first
#define se second
//#define M
//#define mo
#define N 200010
int n, m, i, j, k, T;
int shu[N], Go[N], a[N], vis[N], u, v, w, ans; 
vector<int>G[N]; 
map<pair<int, int>, int>mp; 
queue<int> q; 
stack<int>z, Z; 

struct Un_set {
	int i, f[N]; 
	void reset() {
		for(i = 1; i <= n; ++i) f[i] = i; 
	}
	void set(int x) { f[x] = x - 1; }
	int find(int x) {
		if(f[x] == x) return x; 
		return f[x] = find(f[x]); 
	}
}St;

signed main()
{
	#ifdef LOCALd
	  freopen("in.txt", "r", stdin);
	  freopen("out.txt", "w", stdout);
	#endif
//	srand(time(NULL));
//	T=read();
//	while(T--) {
//
//	}
	n = read(); m = read(); 
	for(i = 1; i <= n; ++i) a[i] = i, G[i].pb(i), G[i].pb(0); 
	for(i = 1; i <= m; ++i) {
		k = read(); swap(a[k], a[k + 1]); 
		if(mp[{a[k], a[k + 1]}] || mp[{a[k + 1], a[k]}]) continue; 
		mp[{a[k], a[k + 1]}] = mp[{a[k + 1], a[k]}] = 1; 
		debug("%d %d\n", min(a[k], a[k + 1]), max(a[k], a[k + 1])); 
		G[min(a[k], a[k + 1])].pb(max(a[k], a[k + 1])); 
	}
	for(i = 1; i <= n; ++i) sort(G[i].begin(), G[i].end()); 
	St.reset(); 
	for(i = n; i >= 1; --i) {
		j = n; j = St.find(j); k = G[i].size() - 1; 
		while(j > i) {
			while(G[i][k] > j) --k; 
			if(G[i][k] != j) break; 
			j = St.find(j - 1); 
		}
		if(j > i) Go[i] = j, shu[j] = i, St.set(j); 
		debug("Go[%d] = %d\n", i, Go[i]); 
	}
//	for(i = 1; i <= n; ++i) debug("%lld ", Go[i]); debug("\n"); 
	for(i = 1; i <= n; ++i) if(!Go[i]) {
		for(j = 1; j <= n; ++j) z.push(j), vis[j] = 0; 
		while(!q.empty()) q.pop(); 
		q.push(i); vis[i] = 1; 
		while(!q.empty()) {
			u = q.front(); q.pop(); k = G[u].size() - 1; v = 0; 
			while(!z.empty() && z.top() > u) {
				v = z.top(); z.pop(); 
				while(G[u][k] > v) 
					/*debug("co(%d %d) ", G[u][k], v), */--k; 
				if(G[u][k] != v) {
					debug("%d %d\n", G[u][k], v); 
					if(shu[v]) {
						if(!vis[shu[v]]) q.push(shu[v]); 
						v = 0; 
					}
					else break; 
					continue; 
				}
				Z.push(v); v = 0; 
			}
			while(!Z.empty()) z.push(Z.top()), Z.pop(); 
			if(v) break; 
		}
		while(u && v) {
			debug("[%d]Change(%d %d)\n", i, u, v); 
			shu[v] = v; w = Go[u]; Go[u] = v; 
			v = w; u = shu[v]; 
		}
		if(v) {
			Go[i] = v, shu[v] = i; 
			debug("Let %d to %d\n", i, v); 
		}
	}
	for(i = 1, ans = n; i <= n; ++i) if(Go[i]) --ans; 
	printf("%d", ans); 
	return 0;
}



### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值