【最短路】BZOJ1001狼抓兔子

来源:互联网 发布:我做淘宝创业5年失败了 编辑:程序博客网 时间:2024/06/05 15:14

题目描述:(略)


分析:
平面图中的最小割=其对偶图的最短路

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#define SF scanf#define PF printfusing namespace std;void Read(int &x){    char c;    bool flag=0;    while(c=getchar(),c!=EOF&&(c<'0'||c>'9')&&c!='-');    if(c=='-')        flag=1;    else        x=c-'0';    while(c=getchar(),c!=EOF&&c>='0'&&c<='9')        x=x*10+c-'0';    if(flag==1)        x=-x;}#define MAXN 1010vector<int> a[2*MAXN*MAXN],w[2*MAXN*MAXN];int n,m,cnt;int num[MAXN][MAXN][2],vis[2*MAXN*MAXN],ans;bool used[2*MAXN*MAXN];queue<int>q;void spfa(){    q.push(0);    vis[0]=0;    while(!q.empty()){        int x=q.front();        q.pop();        used[x]=0;        for(int i=0;i<a[x].size();i++){            if(vis[a[x][i]]<vis[x]+w[x][i]&&vis[a[x][i]]!=-1)                continue;            vis[a[x][i]]=vis[x]+w[x][i];            if(used[a[x][i]]==0){                q.push(a[x][i]);                used[a[x][i]]=1;            }        }    }}int main(){    memset(vis,-1,sizeof vis);    Read(n),Read(m);    if(n==1||m==1){        if(n>m)            swap(n,m);        int ans=-1;        int x;        for(int i=1;i<m;i++){            Read(x);            if(ans==-1||ans>x)                ans=x;        }        PF("%d\n",ans);        return 0;    }    for(int i=1;i<n;i++)        for(int j=1;j<m;j++){            num[i][j][0]=++cnt;            num[i][j][1]=++cnt;        }    for(int i=1;i<=n;i++){        num[i][0][1]=cnt+1;        num[i][0][0]=cnt+1;    }    for(int i=1;i<=m;i++){        num[n][i][0]=cnt+1;        num[n][i][1]=cnt+1;    }    int x;    for(int i=1;i<=n;i++)        for(int j=1;j<m;j++){            Read(x);            a[num[i][j][0]].push_back(num[i-1][j][1]);            w[num[i][j][0]].push_back(x);            a[num[i-1][j][1]].push_back(num[i][j][0]);            w[num[i-1][j][1]].push_back(x);        }    for(int i=1;i<n;i++)        for(int j=1;j<=m;j++){            Read(x);            a[num[i][j][1]].push_back(num[i][j-1][0]);            w[num[i][j][1]].push_back(x);            a[num[i][j-1][0]].push_back(num[i][j][1]);            w[num[i][j-1][0]].push_back(x);        }    for(int i=1;i<n;i++)        for(int j=1;j<m;j++){            Read(x);            a[num[i][j][0]].push_back(num[i][j][1]);            w[num[i][j][0]].push_back(x);            a[num[i][j][1]].push_back(num[i][j][0]);            w[num[i][j][1]].push_back(x);        }    spfa();    PF("%d",vis[cnt+1]);}
原创粉丝点击