HDU 2819 Swap

来源:互联网 发布:何炅主持网络综艺节目 编辑:程序博客网 时间:2024/05/21 17:14

大神博客


需要注意的,在大神博客中都有注明

但是有一点是关于如何输出交换的过程


我刚开始些写的是如果改点的match值不等于自身,那么说明该点交换过了


但是忘了,可能该点经过了多次交换


那么要还原原过程就要倒着来


如果改点match值不等于本身,然后交换值, 交换两个match值


模拟交换的过程来倒着交换


直至所有的点match值都等于本身


#include<bits/stdc++.h>using namespace std;const int maxn=110;int e[maxn][maxn];int vis[maxn];int match[maxn];bool visnum[maxn];int n;void chang(int &a,int &b){    if(a>b)        swap(a,b);}bool find(int u){    for(int i=1; i<=n; i++)    {        if(vis[i]==0&&e[u][i])        {            vis[i]=1;            if(!match[i]||find(match[i]))            {                match[i]=u;                return true;            }        }    }    return false;}int main(){    while(~scanf("%d",&n))    {        for(int i=1; i<=n; i++)        {            for(int j=1; j<=n; j++)            {                scanf("%d",&e[i][j]);            }        }        int ans=0,flag=1;        memset(match,0,sizeof(match));        memset(visnum,0,sizeof(visnum));        for(int i=1; i<=n; i++)        {            memset(vis,0,sizeof(vis));            if(find(i))                ans++;            else                flag=0;        }        if(!flag)        {            printf("-1\n");            continue;        }        int cnt=0;        for(int i=1;i<=n;i++)        {            if(match[i]!=i)                cnt++;        }        printf("%d\n",cnt/2);        for(int i=1; i<=n; i++)        {            if(match[i]!=i)            {                chang(i,match[i]);                if(!visnum[i])                    printf("R %d %d\n",i,match[i]);                visnum[i]=visnum[match[i]]=true;            }        }    }}


原创粉丝点击