poj 2400 Supervisor, Supervisee

呃,这题也太坑人了吧,受不了了~~ 本来想练练自己的代码正确率的,结果一上午就这样的浪费在这道题上了,伤心了,呜呜~~

首先,是这题的输入格式,做之前看了discuss,知道输入的两个矩阵是相反的,所以并没有在这上面浪费多长时间。然后是输出格式,本来想用一个link数组记录下最优匹配就好了,不由深搜,后来才明白,原来题目是让输出所有符合要求的匹配方式,而用数组记录的只是其中一个,最后,最后,就卡死在了一个点上,直到现在还是不明白为什么那样写是错的,感觉没什么大影响啊~恳求哪位大牛能给与指导~~还有一点就是,这题权值搜索要用负值,如果用正的会超时~~

好吧,下面贴出代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#define maxx  20
#define INF  0xffffff
using namespace std;

int mm[maxx][maxx] ;
int vistx[maxx] , visty[maxx] ;
int lx[maxx] , ly[maxx] ;
int linkx[maxx] ;
int mark[maxx] , f[maxx] ;
int n , s , sum , minn ;

int find ( int x )
{
    int i ;
    vistx[x] = 1;
    for ( i = 1 ; i <= n ; i++ )
    if ( !visty[i] )
    {
        int t = lx[x] + ly[i] - mm[x][i] ;
        if ( t == 0 )
        {
            visty[i] = 1;
            if ( linkx[i] == 0 || find ( linkx[i] ))
            {
                linkx[i] = x;
                return 1;
            }
        }
        else if ( minn > t )
        minn = t ;
    }
    return 0;
}

int KM ()
{
    int i , j , k ;
    memset( lx , 0 , sizeof ( lx ));
    memset( ly , 0 , sizeof ( ly ));
    memset( linkx , 0 , sizeof ( linkx ));
    for ( i = 1 ; i <= n ; i++ )
    for ( j = 1 ; j <= n ; j++ )
    if ( lx[i] < mm[i][j] )
    lx[i] = mm[i][j];
    for ( i = 1; i <= n ; i++ )
    {
        while ( 1 )
        {
            memset( vistx , 0 , sizeof ( vistx ));//呃,就是卡死在这里了,将这两个初始化语句放在while
            memset( visty , 0 , sizeof ( visty ));//里面就对,放到外面就WA了,不知道为什么,这有什么影响吗??
            minn = INF ;
            if ( find ( i ))
            break;
            for ( j = 1; j <= n ; j++ )
            {
                if ( vistx[j] )
                lx[j] -= minn ;
                if ( visty[j] )
                ly[j] += minn ;
            }
        }
    }
    int ss = 0;
    for ( i = 1 ; i <= n ; i++ )
    if ( linkx[i] )
    ss += mm[linkx[i]][i];
    return ss;
}


void dfs (  int step , int ans )//深搜输出所有可能的最优匹配
{
    int  i ;
    if ( ans > sum )
    return ;
    if ( step >n )
    {
        if ( ans != sum )
        return ;
        else
        {
            printf ( "Best Pairing %d\n" , s++ );
            for ( i = 1 ; i <= n ; i++ )
            printf ( "Supervisor %d with Employee %d\n" , i , mark[i] );
            return ;
        }
    }
    else
    {
        for ( i = 1 ; i <= n ; i++ )
        if ( !f[i] )
        {
            f[i] = 1;
            mark[step] = i ;
            dfs ( step+1 , ans - mm[step][i] );
            f[i] = 0;
        }
    }
}

int main()
{
    int cas , i , j , k , x;

    scanf ( "%d" , &cas );
    for ( k = 1 ;  k <= cas ; k++ )
    {
        scanf ( "%d" , &n );
        memset( mm , 0 , sizeof ( mm ));
        for ( i = 1 ; i <= n ; i++ )
        for ( j = 1 ; j <= n ; j++ )
        {
            scanf ( "%d" , &x );
            mm[x][i] -= ( j - 1 );//数组要用负值,否则会超时
        }
        for ( i = 1 ; i <= n ; i++ )
        for ( j = 1 ; j <= n ; j++ )
        {
            scanf ( "%d" , &x );
            mm[i][x] -= ( j - 1 );
        }
        sum = -KM();
        printf ( "Data Set %d, Best average difference: %.6lf\n", k , sum / ( 2.0 * n ));
        s = 1;
        memset( mark , 0 , sizeof ( mark ));
        memset( f , 0 , sizeof ( f ));
        dfs( 1 , 0 );
        printf ( "\n" );
    }
    return 0;
}

转载于:https://www.cnblogs.com/misty1/archive/2012/05/20/2509599.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容介绍 项目结构: Controller层:使用Spring MVC来处理用户请求,负责将请求分发到相应的业务逻辑层,并将数据传递给视图层进行展示。Controller层通常包含控制器类,这些类通过注解如@Controller、@RequestMapping等标记,负责处理HTTP请求并返回响应。 Service层:Spring的核心部分,用于处理业务逻辑。Service层通过接口和实现类的方式,将业务逻辑与具体的实现细节分离。常见的注解有@Service和@Transactional,后者用于管理事务。 DAO层:使用MyBatis来实现数据持久化,DAO层与数据库直接交互,执行CRUD操作。MyBatis通过XML映射文件或注解的方式,将SQL语句与Java对象绑定,实现高效的数据访问。 Spring整合: Spring核心配置:包括Spring的IOC容器配置,管理Service和DAO层的Bean。配置文件通常包括applicationContext.xml或采用Java配置类。 事务管理:通过Spring的声明式事务管理,简化了事务的处理,确保数据一致性和完整性。 Spring MVC整合: 视图解析器:配置Spring MVC的视图解析器,将逻辑视图名解析为具体的JSP或其他类型的视图。 拦截器:通过配置Spring MVC的拦截器,处理请求的预处理和后处理,常用于权限验证、日志记录等功能。 MyBatis整合: 数据源配置:配置数据库连接池(如Druid或C3P0),确保应用可以高效地访问数据库。 SQL映射文件:使用MyBatis的XML文件或注解配置,将SQL语句与Java对象映射,支持复杂的查询、插入、更新和删除操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值