2813 One fihgt one //MaxMatch

One fihgt one

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 998    Accepted Submission(s): 302

Problem Description
Lv Bu and his soldiers are facing a cruel war——Cao Cao had his best generals just miles away.

There’s little time , but Lv Bu is unaware of how to arrange his warriors , what he know is that he have n brave generals while Cao Cao has m , and he has k fights to choose from , he’d like to make all his n warriors participate in the battle but get the least injuries . Lv Bu is happy because there is always a good solution . So , now is your task to tell Lv Bu the least injuries his troop would get.
No one could take part in two fights.
 

 

Input
Multiple cases. For each case ,there are three integers in the first line , namely n,m (1<=n<=m<=200)and k (n<=k<=m*n).
The next k lines are the information about k possible fights , for each line are two strings (no more than 20 characters ) and an integer. The first string indicates Lv Bu’s general and the second , of course , Cao Cao’s , and the integer is the injury Lv Bu’s general would get if this fight were chosen.
 

 

Output
One integer , the least injuries Lv Bu’s generals would get.
 

 

Sample Input
  
  
2 3 5 LvBu ZhangFei 6 LvBu GuanYu 5 LvBu XuChu 4 ZhangLiao ZhangFei 8 ZhangLiao XuChu 3
 

 

Sample Output
  
  
8
 

 

Author
shǎ崽
 

 

Source
 

 

Recommend
lcy
 

 

Statistic |  Submit |  Discuss | Back

 

 

#include<cstdio>
#include<string.h>
#include<iostream>
#include<map>
#include<string>
using namespace std;
const int INF=1<<25-1;
int mat[250][250],lx[250],ly[250];//顶点标号
bool sx[250],sy[250];//是否已经搜索过
int link[250],stack[250],cas1,cas2,n,m;
bool path(int k)//从x[k]寻找增广路
{
    sx[k]=true;
    for(int i=0; i<m; i++)
    {
        if(mat[k][i]!=-INF&&!sy[i])
        {
            int t=ly[i]+lx[k]-mat[k][i];
            if(t==0)
            {
                sy[i]=1;
                if(link[i]==-1||path(link[i]))
                {
                    link[i]=k;
                    return true;
                }
            }
            else if(stack[i]>t) stack[i]=t;
        }
    }
    return false;
}
int BestMatch()//求解最小权匹配
{
    int d,sum;
    memset(ly,0,sizeof(ly));
    memset(link,-1,sizeof(link));
    for(int i=0; i<n; i++)
    {
        lx[i]=-1<<24; //x中顶点i的编号为与i关联的Y中边的最大权重
        for(int j=0; j<m; j++) if(lx[i]<mat[i][j]&&mat[i][j]!=-INF)  lx[i]=mat[i][j];
    }
    for(int k=0; k<n; k++)
    {
        for (int i=0; i<m; i++) stack[i]=10000000;
        while(1)
        {
            memset(sx,0,sizeof(sx));
            memset(sy,0,sizeof(sy));
            if(path(k))  break;//匹配成功
            d=10000000;
            for(int i=0; i<m; i++)if (!sy[i]&&stack[i]<d) d=stack[i];
            for(int i=0; i<n; i++) if(sx[i]) lx[i]-=d;
            for(int i=0; i<m; i++) if(sy[i]) ly[i]+=d;
                else  stack[i]-=d;
        }
    }
    sum=0;
    for(int i=0; i<m; i++)
    if(link[i]!=-1)
    sum+=mat[link[i]][i];
//注意这里本来是求的最大权匹配,这里取反即为最小权匹配(因为临街矩阵中的边的权值也取反了)
    return -sum;
}
int main()
{
    int k;
    string s1,s2;
    int c,j1,j2;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        memset(mat,0,sizeof(mat));
        map<string,int>lv,cao;
        map<string,int>::iterator it;
        cas1=0,cas2=0;
        for(int i=0;i<n;i++)
          for(int j=0;j<m;j++)
          mat[i][j]=-INF;
        for(int i=0; i<k; i++)
        {
            cin>>s1>>s2>>c;
            it=lv.find(s1);
            if(it==lv.end()) lv[s1]=cas1,j1=cas1++;
            else  j1=it->second;
            it=cao.find(s2);
            if(it==cao.end()) cao[s2]=cas2,j2=cas2++;
            else  j2=it->second;
            mat[j1][j2]=-c;
        }
        printf("%d/n",BestMatch());
    }
    return 0;
}

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的疫情居家办公系统。该系统旨在为居家办公的员工提供一个高效、便捷的工作环境,同时帮助企业更好地管理远程工作流程。项目包含了完整的数据库设计、前后端代码实现以及详细的文档说明,非常适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 系统的核心功能包括用户管理、任务分配、进度跟踪、文件共享和在线沟通等。用户管理模块允许管理员创建和管理用户账户,分配不同的权限。任务分配模块使项目经理能够轻松地分配任务给团队成员,并设置截止日期。进度跟踪模块允许员工实时更新他们的工作状态,确保项目按计划进行。文件共享模块提供了一个安全的平台,让团队成员可以共享和协作处理文档。在线沟通模块则支持即时消息和视频会议,以增强团队之间的沟通效率。 技术栈方面,后端采用了Spring框架来管理业务逻辑,SpringMVC用于构建Web应用程序,MyBatis作为ORM框架简化数据库操作。前端则使用Vue.js来实现动态用户界面,搭配Vue Router进行页面导航,以及Vuex进行状态管理。数据库选用MySQL,确保数据的安全性和可靠性。 该项目不仅提供了一个完整的技术实现示例,还为开发者留下了扩展和改进的空间,可以根据实际需求添加新功能或优化现有功能。
本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的网上球鞋竞拍系统。该项目旨在为球鞋爱好者提供一个便捷、高效的在线竞拍平台,用户可以在此平台上浏览、搜索、竞拍心仪的球鞋,并参与到各种有趣的竞拍活动中。 系统的主要功能包括用户注册登录、球鞋信息展示、竞拍活动创建与管理、实时竞拍以及交易安全保障等。用户可以通过注册账号后,浏览平台上发布的各类球鞋信息,包括品牌、型号、颜色、尺码以及当前竞拍状态等。系统支持用户创建和管理自己的竞拍活动,设定竞拍规则和时间,同时提供实时竞拍功能,确保公平、透明的交易过程。 在技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,保证了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提高了开发效率和用户体验。 数据库设计方面,系统采用了MySQL数据库,存储用户信息、球鞋信息、竞拍活动等数据,确保数据的安全性和完整性。此外,项目还包含了详细的文档资料,包括需求分析、系统设计、数据库设计以及测试报告等,为项目的实施和维护提供了有力的支持。 该项目不仅适合作为计算机相关专业学生的毕业设计题目,也适合Java学习者进行实战练习,通过在此基础上进行功能扩展和改进,可以进一步提升编程技能和项目管理能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值