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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章