将最大流问题先转化为最小割问题最后通过求对偶图中的最短路来解题
最短路用dij跑就好
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#define MAX 2000000
using 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]);
}