可能的问题:邻接矩阵 and 20pts
查看原帖
可能的问题:邻接矩阵 and 20pts
1029493
lmrab楼主2025/8/5 09:08

这道题有重边且点的规模较小

所以用邻接矩阵存图是和我英雄所见略同合理的

但是这道题的输入有点特殊

左部点从 1 至 n 编号,右部点从 1 至 m 编号。

每行两个整数 u,v,表示存在一条连接左部点 u 和右部点 v 的边。

所以存图逻辑应该是这样:

for(int i=1;i<=e;++i){
		int u,v; cin>>u>>v;
		G[u][v]=1;
//	WA code 
//	G[u][v]=1; G[v][u]=1;

//	u是左部点,v是右部点,存双向导致多存边:
//	比如输入   2 4 
//	left-2到right-4有边,left-4到right-2也有边(?!)
//	大WA特WA 
	}

遍历逻辑应该是这样:

int dfs(int u,int tg){
	if(vis[u]==tg) return 0;
	vis[u]=tg;//这个是习惯问题,清空vis数组也可以 
	for(int v=1;v<=m;++v){
//问题一:v应当从1~m遍历,我们从左部点向右部点匹配 
		if(!g[u][v]) continue;
//问题二:要把存的图用上,本蒟蒻就是这里错了(这诗人? 
		if(mch[v]==0 or dfs(mch[v],tg)){ 
			mch[v]=u;
//问题三:要区分左部点和右部点:
//从左部点出发,沿边找到的都是右部点(题目保证)
//同理右部点的匹配都是左部点 
//dfs里的u代表一个左部点,应该dfs(mch[v],tg)而非dfs(v,tg) 
			return 1;
		}
	}
	return 0;
}
2025/8/5 09:08
加载中...