bzoj1001 平面图转对偶图

来源:互联网 发布:通山网络花店 编辑:程序博客网 时间:2024/05/01 10:02

将最大流问题先转化为最小割问题最后通过求对偶图中的最短路来解题

最短路用dij跑就好

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vector>#include<queue>#define MAX 2000000using namespace std;struct wbysr{int dist,num;bool operator < (const wbysr &fuck)const { return dist>fuck.dist; }};int n,i,m,t,d[MAX],done[MAX];vector <int>aim[MAX];vector<int>w[MAX];void debug(){for(int i=0;i<=t;i++,printf("%d\n",i-1),printf("\n"))for(int j=0;j<aim[i].size();j++)printf("%d-%d    ",aim[i][j],w[i][j]);}void dijstra(int v){d[v]=0;memset(done,0,sizeof(done));    priority_queue<wbysr> q;    q.push((wbysr){0,v});    while(!q.empty())     {     wbysr x=q.top();     q.pop();     int now=x.num;     if(done[now])continue;     done[now]=1;     for(int k=0;k<aim[now].size();k++)       if(d[aim[now][k]]>d[now]+w[now][k])        {        d[aim[now][k]]=d[now]+w[now][k];        q.push((wbysr){d[aim[now][k]],aim[now][k]});        }     }}void addedge(int from,int to,int value){aim[from].push_back(to);aim[to].push_back(from);w[from].push_back(value);w[to].push_back(value);return;}int getint(){int num;scanf("%d",&num);return num;}int main(){scanf("%d%d",&n,&m);int s=0,o;t=(n)*(m)+1;    if (n == 1)    {int ans,t;scanf("%d",&ans);        for (int i = 2; i < m; ++ i)            scanf("%d",&t),ans = min(ans,t);        printf("%d\n", ans);        return 0;    }    if (m == 1)    {        int ans,t;scanf("%d",&ans);        for (int i = 2; i < n; ++ i)            scanf("%d",&t),ans = min(ans,t);        printf("%d\n", ans);        return 0;    }    for (int i = 1; i < m; ++ i)        addedge(i * 2, t, getint());    for (int i = 1; i < n - 1; ++ i)        for (int j = 1; j < m; ++ j)            addedge(i * (m - 1) * 2 + j * 2, (i - 1) * (m - 1) * 2 + j * 2 - 1, getint());    for (int i = 1; i < m; ++ i)        addedge(0, (n - 2) * (m - 1) * 2 + i * 2 - 1, getint());    for (int i = 0; i < n - 1; ++ i)    {        addedge(0, i * (m - 1) * 2 + 1, getint());        for (int j = 1; j < m - 1; ++ j)            addedge(i * (m - 1) * 2 + j * 2, i * (m - 1) * 2 + j * 2 + 1, getint());        addedge((i + 1) * (m - 1) * 2, t, getint());    }    for (int i = 0; i < n - 1; ++ i)        for (int j = 1; j < m; ++ j)            addedge(i * (m - 1) * 2 + j * 2 - 1, i * (m - 1) * 2 + j * 2, getint());memset(d,63,sizeof(d));dijstra(s);//debug();printf("%d\n",d[t]);}

0 0
原创粉丝点击