您的位置:首页 > 其它

hdu 2819【Swap】

2012-05-11 15:47 148 查看
不错的一道题目,但是中途我还是出问题了,代码中有注释

代码如下:

#include <cstdio>
#include <cstring>

struct node
{
int x,y;
}ans[1005];

int g[200][200];
bool vis[200];
int link[200];
int match[200];
int n;

void init()
{
memset(link, -1,sizeof(link));
}

bool can(int x)
{
for(int i = 0;i < n;i ++)
{
if(g[i][x]&&!vis[i])//这里我用的是g[i][x],我要获得的是行的匹配的列的值
{
vis[i] = true;
if(link[i] == -1 || can(link[i]))
{
link[i] = x;
return true;
}
}
}

return false;
}

int maxmatch()
{
int num = 0;
for(int i = 0;i < n;i ++)
{
memset(vis,false,sizeof(vis));
if(can(i))
num++;
}

return num;
}
int main()
{
while(scanf("%d",&n) == 1)
{
init();
for(int i = 0;i < n;i ++)
{
for(int j = 0;j < n;j ++)
{
scanf("%d",&g[i][j]);
}
}

if(maxmatch() != n)
{
printf("-1\n");
}
else
{
int num = 0;
for(int i = 0;i < n;i ++)
{
if(link[i] != -1)
{
match[link[i]] = i;//列匹配行
}
}
int k  = 0;
for(int i = 0;i < n;i ++)
{
if(link[i] != i)
{
ans[k].x = i + 1;
ans[k ++].y = link[i] + 1;
link[match[i]] = link[i];
match[link[i]] = match[i];//坑啊,我就是这里忘记改变列匹配的值了,结果一直WA,还是看了别人的代码才知道的,呜呜
}
}
printf("%d\n",k);
for(int i = 0;i < k;i ++)
{
printf("C %d %d\n",ans[i].x,ans[i].y);
}
}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: