POJ3020(最小路径覆盖)

最小路径覆盖=定点数-最大匹配数/2

#include
#include
#include
#include

using namespace std;

char s[50][50];
struct P{
     
int x,y;}
a[500];
int cnt =1;
int vis[500],l[500];
int e[500][500];
bool serch(int x){
     
for(int j = 1;j <= cnt;j++)
{
     
     if(!vis[j] &&e[x][j])
     {
     
         vis[j]=1;
         if(l[j]== -1 || serch(l[j]))
          {
     
              l[j]=x;
              return true;
          }
     }
}
return false;
}
int main()
{
        int t;
    cin>>t;
    int h,w;
    while(t--)
   {
      memset(e,0,sizeof(e));
     cnt =1;
     cin>>h>>w;
    for(int i =0 ;i < h;i ++)
        for(int j = 0;j < w;j++)
    {
          cin>>s[i][j];
            if(s[i][j] == '*') {
     
            a[cnt].x=i;
            a[cnt].y=j;
            cnt++;
           }
    }
    cnt--;
    for(int i = 1;i <= cnt;i++)
        for(int j = 1;j<=cnt;j++)
         {
     
             //if(i==j)continue;
             if(a[i].x==a[j].x &&a[i].y==a[j].y+1&&a[j].y+1<w) e[i][j]=1;
             if(a[i].x==a[j].x &&a[i].y==a[j].y-1&&a[j].y-1>=0)e[i][j]=1;
             if(a[i].y==a[j].y &&a[i].x==a[j].x+1&&a[j].x+1<h) e[i][j]=1;
             if(a[i].y==a[j].y &&a[i].x==a[j].x-1&&a[j].x-1>=0)e[i][j]=1;
         }
    memset(l,-1,sizeof(l));
    int ans = 0;
    for(int i =1;i <= cnt;i ++)
    {
     
        memset(vis,0,sizeof(vis));
        if(serch(i)) ans++;
    }
      cout<<cnt-ans/2<<endl;
}
return 0;
}

你可能感兴趣的:(图论)