错两,超时两,求大佬指教
查看原帖
错两,超时两,求大佬指教
322579
Guanrenhan楼主2024/7/25 18:29
#include<cstring>  
#include<algorithm>  
#include<cmath>  
#include<queue>  
#define inf 1000000007  
using namespace std;  
int n,m,g[101][101],h[10001],cnt=1,ans,dis[10001];  
struct Edge{  
  int next,to,c;  
}e[100001];  
void add(int u,int v,int w)  
{  
    cnt++;  
    e[cnt].next=h[u];  
    h[u]=cnt;  
    e[cnt].to=v;  
    e[cnt].c=w;
}  
bool bfs()  
{  
  queue<int> q;  
  memset(dis,0,sizeof(dis));  
  dis[0]=1;  
  q.push(0);  
  while(!q.empty())  
  {  
    int now=q.front();  
    q.pop();  
    for(int i=h[now];i!=0;i=e[i].next)  
      if(dis[e[i].to]==0&&e[i].c>0)  
      {  
        dis[e[i].to]=dis[now]+1;  
        q.push(e[i].to);  
      }  
  }  
  return dis[n*m+1]!=0;  
}  
int dfs(int k,int mn)  
{  
    if(k==n*m+1)  
      return mn; 
    int num=0;  
    for(int i=h[k];i!=0;i=e[i].next)  
    {  
 if(dis[e[i].to]==dis[k]+1&&e[i].c>=1&&num<mn)  
      {  
          int F=dfs(e[i].to,min(e[i].c,mn-num));  
          num+=F;  
          e[i].c-=F;   
          e[i^1].c+=F;  
      }  
    }
    return num;  
}  
int main()  
{  
    cin>>n>>m;  
    for(int i=1;i<=n;i++)  
      for(int j=1,x;j<=m;j++)  
      {  
        cin>>x;  
        if(i!=1)  
        {  
            add((i-1)*m+j,(i-1)*m+j-m,1);  
            add((i-1)*m+j-m,(i-1)*m+j,-1);  
        }  
        if(i!=n)  
        {  
            add((i-1)*m+j,(i-1)*m+j+m,1);  
            add((i-1)*m+j+m,(i-1)*m+j,-1);  
        }  
        if(j!=1)  
        {  
            add((i-1)*m+j,(i-1)*m+j-1,1);  
            add((i-1)*m+j-1,(i-1)*m+j,-1);  
        }  
        if(j!=m)  
        {  
            add((i-1)*m+j,(i-1)*m+j+1,1);  
            add((i-1)*m+j-1,(i-1)*m+j,-1);  
        }  
        if(x==1)  
        {  
            add(0,(i-1)*m+j,inf);  
            add((i-1)*m+j,0,0);  
        }  
        if(x==2)  
        {  
            add((i-1)*m+j,n*m+1,inf);  
            add(n*m+1,(i-1)*m+j,0);  
        }  
      }  
    while(bfs())  
      ans+=dfs(0,inf);  
    cout<<ans;  
    return 0;  
}
2024/7/25 18:29
加载中...