hdu 1853and3488 (Cyclic Tour )and(Tour)(二分图)

天下题目一大抄,好吧!刚刚写的1853的代码!然后又找了一个二分图题目来做,一看,擦,这不是一样的吗(就是输入格式不一样)!于是鼓起勇气提交,好吧!AC!!!

小小的格式变动啊!哎····,这样的题存在一道即可!!!连测试实例都一样!哎·······


二分图学了好久虽说学会的很少,可是这很少的也忘的差不多了,今天看了别人讲的学习算法一定要温故而知新,以后一定要多多的打以前学过的算法!不能········

一道简单的二分图奉上!!!

#include<stdio.h>
#include<string.h>


#define inf 10000000
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b


int n;
int match[1010],sx[1010],sy[1010],map[1010][1010],lx[1010],ly[1010];


int find(int k)
{
int i;
sx[k]=1;
for(i=1;i<=n;i++)
{
if(lx[k]+ly[i]==map[k][i]&&sy[i]==0)
{
sy[i]=1;
if(match[i]==0||find(match[i]))
{
match[i]=k;
return 1;
}
}
}
return 0;
}


int KM()
{
int i,j,k,ans=0;
memset(match,0,sizeof(match));
memset(lx,0,sizeof(lx));
memset(ly,0,sizeof(ly));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
lx[i]=max(lx[i],map[i][j]);
for(i=1;i<=n;i++)
{
while(1)
{
memset(sx,0,sizeof(sx));
memset(sy,0,sizeof(sy));
if(find(i))break;
else
{
int a=inf;
for(j=1;j<=n;j++)
if(sx[j])
for(k=1;k<=n;k++)
if(!sy[k])
a=min(a,lx[j]+ly[k]-map[j][k]);
if(a==inf)return 1;
for(j=1;j<=n;j++)
{
if(sx[j])lx[j]-=a;
if(sy[j])ly[j]+=a;
}
}
}
}
for(i=1;i<=n;i++)
{
if(map[match[i]][i]==-inf)
return 1;
if(match[i]!=0&&map[match[i]][i]!=-inf)
ans+=map[match[i]][i];
}
return ans;
}


int main()
{
int m,i,j,v,u,w,ans,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=-inf;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&v,&u,&w);
if(-w>map[v][u])
map[v][u]=-w;
}
ans=KM();
printf("%d\n",-ans);
}
return 0;
}

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3488

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值