1043 What's In A Name?

orz,我真的不知道哪里出错了,,,今天状态不是很好,就这一道题都没做完
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

char id[ 20 ][ 20 ];
char name[ 20 ][ 20 ];
bool visit[ 20 ];
int link_name[ 20 ];
bool graph[ 20 ][ 20 ];
int order[ 20 ];
int match_id[ 20 ];
int n ;
int inHideout[ 20 ];


bool cmp( int i , int j ){
	if (memcmp(name[i],name[j],sizeof name[i]) <= 0) return 1;
 		else return 0;
}

//加深为匈牙利求最大二分
int dfs( int k ){                    // k 是左边点集   遍历右边点集i 
	for( int i = 0 ; i < n ; i ++ ){
		if( graph[ k ][ i ] && !visit[ i ] ){
			visit[ i ] = true;
			if( link_name[ i ] == -1 || dfs( link_name[ i ] ) ){
				link_name[ i ] = k;
				return 1;
			}
		}
	}
	return 0;
}

int hungry( ){
	int res = 0;
	memset( link_name , -1 , sizeof( link_name )); 
	for( int i = 0 ; i < n ; i ++ ){
		memset( visit , 0 , sizeof( visit ));
		res += dfs( i );
	}
	return res;
}


int main(){
//	freopen( "in.txt" , "r" , stdin );
	scanf("%d" , &n );
	for( int i = 0 ; i < n ; i ++ )scanf( "%s", id[ i ] );
	int nameCnt = 0;
	memset( graph , true , sizeof( graph ));
	memset( match_id , -1 , sizeof( match_id ));
	memset( inHideout , 0 , sizeof( inHideout ));
	while( true ){
		char type;
		cin>>type;
		if( type == 'Q')break;
		char tmpName[ 20 ];
		cin>>tmpName;
		nameCnt++;
		int i; 
		switch (type){
		case 'E':{
			for( i = 0 ; i < nameCnt && strcmp( name[ i ] , tmpName ) != 0 ; i ++ );
			if( i == nameCnt )strcpy( name[ nameCnt++ ] , tmpName );
			inHideout[ i ] = 1 ;
			break;
		}
		case 'L':{
			for( i = 0 ; i < nameCnt && strcmp( name[ i ] , tmpName ) != 0 ; i ++ );
			inHideout[ i ] = 0;
			break;
		}
		case 'M':{
			for( i = 0 ; i < n && strcmp( id[ i ] , tmpName ) != 0 ; i ++ )
			for( int j = 0 ; j < n ; j ++ ){
				if( !inHideout[ j ])graph[ j ][ i ] = false;
			}
			break;
		}
		}
		
	}
			
		for( int i = 0 ; i < n ; i ++ ){
			for( int j = 0 ; j < n ; j ++ ){
				if( graph[ i ][ j ] ){
					graph[ i ][ j ] = false;
					if( hungry() != n ){
						graph[ i ][ j ] = true;
						match_id[ i ] = j;
						break;
					}
					graph[ i ][ j ] = true;
				}
			}
		}
		
		for( int i = 0 ; i < n ; i ++ )order[ i ] = i ;
		sort( order , order + n , cmp );
		
		for( int i = 0 ; i < n ; i ++ ){
			printf( "%s" , name[ order[ i ] ]);
			printf(":");
			if( match_id[ order[ i ] ] != -1 )printf("%s" , id[ match_id[ order[ i ] ]]);
			else printf("???");
			printf("\n");
		}
		return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值