为什么二分图只有20分,求助

P2704 [NOI2001] 炮兵阵地

y2823774827y @ 2018-08-08 16:12:30

#include<cstdio>
#include<cstring>
using namespace std;
struct node{
    int to,next;
}dis[1000005];
int dx[9]={0,-1,-2,0,0,1,2,0,0},dy[9]={0,0,0,1,2,0,0,-1,-2};
int n,m,cnt,shu,ans; int num[105][15],mat[1005],head[1005]; bool visit[1005];
char c[105][15];
inline void add(int u,int v){
    dis[++shu].to=v; dis[shu].next=head[u]; head[u]=shu;
}
int dfs(int x){
    for(int i=head[x];i;i=dis[i].next){
        int v=dis[i].to;
        if(!visit[v]){
            visit[v]=true;
            if(!mat[v]){
                mat[v]=x;
                mat[x]=v;
                return 1;
            }else if(dfs(mat[v])){
                mat[v]=x;
                mat[x]=v;
                return 1;
            }
        }
    }
    return 0;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j){
            scanf(" %c",&c[i][j]);
            if(c[i][j]=='P')
                num[i][j]=++cnt;
        }
    /*for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j)
            printf("%d ",num[i][j]);
        printf("\n");
    }*/
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            if(num[i][j]){
                printf("%d:",num[i][j]);
                for(int k=1;k<=8;++k){
                    int x1=i+dx[k],y1=j+dy[k];
                    if(x1<1||x1>n||y1<1||y1>m) continue;
                    if(num[x1][y1])
                        add(num[i][j],num[x1][y1]);
                }
            }
    for(int i=1;i<=cnt;++i)
        if(!mat[i]){
            memset(visit,0,sizeof(visit));
            ans+=dfs(i);
        }
    printf("%d",cnt-ans);
    return 0;
}/*
5 4
PHPP
PPHH
PPPP
PHPP
PHHP

6
*/

by partychicken @ 2018-08-08 16:15:10

@Y2823774827 不是很懂你是怎么看出二分图的


by partychicken @ 2018-08-08 16:15:27

@Y2823774827 能详细点说一下吗


by y2823774827y @ 2018-08-08 16:17:38

将平原与能攻击到的平原连线 然后答案就是该二分图的最大独立集@partychicken


by y2823774827y @ 2018-08-08 16:19:01

感觉和P4304差不多 一个思路@partychicken


by partychicken @ 2018-08-08 16:19:09

@Y2823774827 这真的是二分图吗,你想一下


by joshuaxia @ 2018-08-08 16:19:57

he 看起来很麻烦


by partychicken @ 2018-08-08 16:20:42

@Y2823774827 不一样的,那个是日字型,满足二分图。。但这个应该不行


by y2823774827y @ 2018-08-08 16:21:16

不太明白为什么错了 请大佬直说@partychicken


by partychicken @ 2018-08-08 16:22:21

@Y2823774827 我弱啊

我脑补一下感觉你这么建出来的不是二分图


by partychicken @ 2018-08-08 16:23:39

P4304黑白染色后同色直接不产生冲突,所以满足二分图


| 下一页