0分求助。。自认为不应该啊
查看原帖
0分求助。。自认为不应该啊
55902
Key丶楼主2020/4/28 13:54
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int t,n,tag;
int home[110],school[110],pd[110],pre[110];
int m[110][110];


struct arcnode {
	int v;
	arcnode *next;
};
struct vexnode {
	int u;
	arcnode *firstarc;
} vex[110];


void addline(int u,int v) {
	arcnode *p=new arcnode;
	p->v=v;
	p->next=vex[u].firstarc;
	vex[u].firstarc=p;
}
int dfs(int u) {
	arcnode *p=vex[u].firstarc;
	while(p!=NULL) {
		if(!pd[p->v]) {//如果不在增广路径中 
			pd[p->v]=1;
			if(!pre[p->v]||dfs(pre[p->v])) {
				pre[p->v]=u;
				return 1;
			}
		}
		p=p->next;
	}
	return 0;
}
int main() {
	cin>>t;
	while(t>0) {
		t--;
		tag=0;
		memset(school,0,sizeof(school));
		memset(vex,0,sizeof(vex));
		memset(home,0,sizeof(home));
		memset(m,0,sizeof(m));
		memset(pre,0,sizeof(pre));
		cin>>n;
		for(int i=1; i<=n; i++) {
			scanf("%d",&school[i]);
		}
		for(int i=1; i<=n; i++) {
			scanf("%d",&home[i]);
		}
		for(int i=1; i<=n; i++) {
			if(school[i])addline(i,n+i);
		}
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				int a=0;
				cin>>a;
				if(a==1&&!m[i][j]) {
					m[i][j]=1;
					if(school[i]&&!home[j])addline(j,n+i);
					if(school[j]&&!home[i])addline(i,n+j);
				}
			}
		}
		for(int i=1; i<=n; i++) {
			memset(pd,0,sizeof(pd));
			if(!home[i]||(home[i]&&!school[i])){
				if(!dfs(i)) {
					cout<<"T_T"<<endl;
					tag=1;
				}
			}

		}
		if(!tag)cout<<"^_^"<<endl;
	}
	return 0;
}
/*
1
2
1 0
0 1
0 1
1 0
*/

思路就是匈牙利算法,数组初始化也做了,但是是全wa,球球牛牛们帮忙看看哪里错了,或者给我一组数据试试,因为我这里不知道为啥连数据都不能下载

2020/4/28 13:54
加载中...