hdu 2819 求最小顶点覆盖数

来源:互联网 发布:vs.php for vs2015 编辑:程序博客网 时间:2024/06/06 05:56

和其他最小顶点覆盖数题没啥区别

唯一区别是求完之后要交换一下列或者行

将你求得的匹配行或者列交换一下再输出就好

#include<bits/stdc++.h>using namespace std;#define MAX_PATH 1000#define me(a) memset(a,-1,sizeof(a))int top,head[MAX_PATH],f[MAX_PATH],book[MAX_PATH],map1[MAX_PATH][MAX_PATH],l[MAX_PATH],r[MAX_PATH];/*struct node{    int u,next;}e[MAX_PATH];void add(int u,int v){    e[top].u=v;    e[top].next=head[u];    head[u]=top++;}*/int n;int dfs(int x){    for(int i=0;i<n;i++)    {        if(book[i]==-1&&map1[x][i]==1)        {            book[i]=1;            if(f[i]==-1||dfs(f[i]))            {                f[i]=x;                return 1;            }        }    }    return 0;}int main(){   while(~scanf("%d",&n))   {       //me(head);       me(f);       memset(map1,0,sizeof(map1));       top=0; int a;       for(int i=0;i<n;i++)           for(int j=0;j<n;j++)           {               scanf("%d",&a);               map1[i][j]=a;           }           int ans=0;           for(int i=0;i<n;i++)           {               me(book);               if(dfs(i))ans++;           }           if(ans<n)           {               printf("-1\n");               continue;           }           else           {               int sum=0;                for(int i=0;i<n;i++)               {                   if(f[i]==i)continue;                   for(int j=0;j<n;j++)                   if(f[j]==i)                   {                       swap(f[i],f[j]);                     l[sum]=i,r[sum++]=j;                   }               }               printf("%d\n",sum);               for(int i=0;i<sum;i++)               {                   printf("C %d %d\n",l[i]+1,r[i]+1);               }           }   }}

原创粉丝点击