HDU 2813 One fihgt one map+最大匹配值

来源:互联网 发布:ant运行java文件 编辑:程序博客网 时间:2024/05/21 07:40
点击打开链接

One fihgt one

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



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 5LvBu ZhangFei 6LvBu GuanYu 5LvBu XuChu 4ZhangLiao ZhangFei 8ZhangLiao XuChu 3
 

Sample Output
8
 

Author
shǎ崽
 

Source
HDU 1st “Old-Vegetable-Birds Cup” Programming Open Contest
 

Recommend
lcy

题意是说吕布要和曹操打仗,吕布手下有n元大将,曹操手下有m元大将,有k场战役,每场战役吕布派一名大将跟曹操的一名大将单挑,并且给你耗血量,让你求吕布军所有大将耗血量最低。
二分匹配求最大匹配值,用map来标记,968秒过。


#include<stdio.h>#include<string.h>#include<string>#include<map>#define M 207#define inf 1<<30using namespace std;int lx[M],ly[M],g[M][M];int slack[M],match[M];bool visx[M],visy[M];int n,m,k;bool dfs(int cur){    visx[cur]=true;    for(int y=1; y<=m; y++)    {        if(!visy[y]&&lx[cur]+ly[y]==g[cur][y])        {            visy[y]=true;            if(match[y]==-1||dfs(match[y]))            {                match[y]=cur;                return true;            }        }//        else if(slack[y]>t)//            slack[y]=t;    }    return false;}void KM(){    memset(match,-1,sizeof(match));    memset(ly,0,sizeof(ly));    for(int i=1; i<=n; i++)    {        lx[i]=-inf;        for(int j=1; j<=m; j++)            lx[i]=max(lx[i],g[i][j]);    }    for(int x=1; x<=n; x++)    {//        for(int i=1; i<=m; i++)//            slack[i]=inf;        while(true)        {            memset(visx,false,sizeof(visx));            memset(visy,false,sizeof(visy));            if(dfs(x))break;            int d=inf;            for(int j=1;j<=n;j++)                if(visx[j])                {                    for(int k=1;k<=m;k++)                    {                        if(!visy[k]&&d>lx[j]+ly[k]-g[j][k])                        {                            d=lx[j]+ly[k]-g[j][k];                        }                    }                }//            for(int i=1; i<=m; i++)//                if(!visy[i]&&d>slack[i])//                    d=slack[i];//            if(d==inf)return ;            for(int i=1; i<=n; i++)                if(visx[i])                    lx[i]-=d;            for(int i=1; i<=m; i++)                if(visy[i])                    ly[i]+=d;//                else//                    slack[i]-=d;        }    }}int main(){    //freopen("in.txt","r",stdin);    while(scanf("%d%d%d",&n,&m,&k)!=EOF)    {        char s1[22],s2[22];        int a,num1=1,num2=1;        for(int i=1; i<=n; i++)            for(int j=1; j<=m; j++)                g[i][j]=-inf;        map<string,int>mp1,mp2;        for(int i=1; i<=k; i++)        {            scanf("%s%s%d",s1,s2,&a);            if(!mp1[s1])            {                mp1[s1]=num1++;            }            if(!mp2[s2])            {                mp2[s2]=num2++;            }            g[mp1[s1]][mp2[s2]]=-a;        }        KM();        int result=0;        for(int i=1; i<=m; i++)        {            if(match[i]!=-1&&g[match[i]][i]!=-inf)                result+=g[match[i]][i];        }        printf("%d\n",-result);    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 早孕办公室买新办公桌怎么办 一年级学生专注度差怎么办 pscs6界面字体太小怎么办 psd文件打不开程序错误怎么办 经常熬夜皮肤暗黄怎么办 炎症引起的经期不来怎么办 父母沉迷于炒股该怎么办 宝宝嘴周边红了怎么办 后背被嘴吸出牙印怎么办 宝宝嘴巴周围长湿疹怎么办 宝宝脸蛋都是红红的湿疹怎么办 药流药第一天晚上的忘吃怎么办 我有口臭不想出门怎么办 入职10天想辞职怎么办 提完辞职报告不想上班了怎么办 吃流产药出血少怎么办 新车漆被刮掉了怎么办 新车被别人撞了怎么办 新买的车被撞了怎么办 临时牌掉了一张怎么办 车子在停车场被刮了怎么办 金毛不想养了怎么办 gta5老是掉线怎么办ps4 养狗身上有味道怎么办 身上有异味怎么办%3f 花钱花多了后悔怎么办 想去当兵有纹身怎么办 爸家里人欺负我妈怎么办 部队退伍登记表填错怎么办 新手程序员第一次做项目怎么办 十六岁月经量少怎么办 大姨妈第一天痛怎么办 月经第一天很疼怎么办 神器挑战任务放弃了怎么办 内蒙古森林武警改革新兵怎么办 手挨打了有点肿怎么办 征兵过程中身份证号重复怎么办 去当兵身上有纹身怎么办 武警警卫部队改革新兵怎么办 肾结石3mm很痛怎么办 剖腹产第6天肾结石痛怎么办