请问这道题我写的哪里不对
查看原帖
请问这道题我写的哪里不对
142549
hbhz_zcy楼主2022/4/24 15:09

(没有账号,在别处交的) 我发现我写的这种匈牙利算法和本题题解(另一篇)的不一样,但是都能过板子

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=700;
int N,k1,k2,N1,vis[maxn],p[maxn],head[maxn],nume=0,cnt=0,lk[maxn][2],uk[maxn][2],e1[maxn];//animal num
struct node{int to,nxt;}e[maxn*maxn];
int qd(){
	int rt=0;char c=getchar();
	while(c<'0'||c>'9')  c=getchar();
	while('0'<=c&&c<='9')  rt=(rt<<3)+(rt<<1)+c-48,c=getchar();
	return rt;
}
char gc(){
	char c=getchar();
	while(c!='C'&&c!='D')  c=getchar();
	return c;
}
void edgen(int from,int to){
	e[++nume].nxt=head[from];
	head[from]=nume;
	e[nume].to=to;
}
void dfs1(int u,int c){
	vis[u]=1;
	if(c)  e1[++N1]=u;
//	if(c)  printf("get %d\n",u);
	for(int i=head[u];i;i=e[i].nxt){
		if(!vis[e[i].to])  dfs1(e[i].to,c^1);
	}
}
bool dfs(int u,int from){
	if(vis[u]==from)  return 0;
	vis[u]=from;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(!p[v]||dfs(vis[p[v]],from)){p[v]=u;return 1;}
	}
	return 0;
}
int main(){
	k1=qd(),k2=qd(),N=qd();
	for(int i=1;i<=N;i++){
		char c=gc();int x=qd(),y=qd();
		if(c=='C')  lk[i][0]=0,lk[i][1]=x,uk[i][0]=1,uk[i][1]=y;
		else lk[i][0]=1,lk[i][1]=x,uk[i][0]=0,uk[i][1]=y;
	}
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			if(i==j)  continue;
			if(lk[i][0]==uk[j][0]&&lk[i][1]==uk[j][1])  edgen(i,j),edgen(j,i);
		}
	}
	for(int i=1;i<=N;i++)  if(!vis[i])  dfs1(i,1);
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=N1;i++)  if(dfs(e1[i],e1[i]))  cnt++;
	printf("%d\n",N-cnt);
	return 0;
}
2022/4/24 15:09
加载中...