此题有重边?
查看原帖
此题有重边?
356081
Night_7d5楼主2021/9/30 21:20
#include<bits/stdc++.h>
#define N 1005
using namespace std;
int n,m,p[N],q[N];
struct edge {
	int to,next;
}e[N];
int head[N],cnt;
void add(int u,int v) {
	e[++cnt].next=head[u];
	e[cnt].to=v;
	head[u]=cnt;
}
bool vis[N];
bool match(int u) {
	for(int i=head[u];i;i=e[i].next) {
		int v=e[i].to;
		if(!vis[v]) {
			vis[v]=1;
			if(!p[v]||match(p[v])) {
				p[v]=u;
				q[u]=v;
				return true;
			}
		}
	}
	return false;
}
int Hungarian() {
	int tot=0;
	for(int i=1;i<=m;i++) {
		if(match(i)) ++tot; 
		else return tot;
		memset(vis,0,sizeof(vis));
	}
	return tot;
}
int main() {
	scanf("%d%d",&n,&m);
	for(int u=1,v;u<=m;u++) {
		scanf("%d",&v);
		add(u,v);
		scanf("%d",&v);
		add(u,v);
	}
	int tot=Hungarian();
	printf("%d\n",tot);
	for(int i=1;i<=tot;i++) {
		printf("%d\n",q[i]);
	}
	return 0;
}

50分代码,链式前向星存图

#include<bits/stdc++.h>
#define N 1005
using namespace std;
int n,m,G[N][N],p[N],q[N];
bool vis[N];
bool match(int u) {
	for(int v=0;v<n;v++) {
		if(!vis[v]&&G[u][v]) {
			vis[v]=1;
			if(!p[v]||match(p[v])) {
				p[v]=u;
				q[u]=v;
				return true;
			}
		}
	}
	return false;
}
int Hungarian() {
	int cnt=0;
	for(int i=1;i<=m;i++) {
		if(match(i)) ++cnt; 
		else return cnt;
		memset(vis,0,sizeof(vis));
	}
	return cnt;
}
int main() {
	scanf("%d%d",&n,&m);
	for(int u=1,v;u<=m;u++) {
		scanf("%d",&v);
		G[u][v]=1;
		scanf("%d",&v);
		G[u][v]=1;
	}
	int tot=Hungarian();
	printf("%d\n",tot);
	for(int i=1;i<=tot;i++) {
		printf("%d\n",q[i]);
	}
	return 0;
}

AC代码,邻接矩阵存图

2021/9/30 21:20
加载中...