模板
平面图上最大流。
平面图转对偶图:旋转边90度
注意跑dijkstra的最短路
卡SPFA
#include<bits/stdc++.h>
using namespace std;
const int N=3e5;
const int INF=1e9+7;
struct Front_star{
int u,v,w,nxt;
}e[N*4];
int cnt=1;
int first[N]={0};
void add(int u,int v,int w){
cnt++;
e[cnt].u=u;
e[cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=first[u];
first[u]=cnt;
}
//void add(int u,int v,int w){
// addedge(u,v,w);
// addedge(v,u,0);
//}
int n;
int S=0;
//int T=250000+2;
#define T n*n+2
struct Node{
int u,w;
};
priority_queue<Node> q;
bool operator <(Node A,Node B){
return A.w>B.w;
}
int dis[N]={0};
void dijkstra(){
for(int i=S;i<=T;i++){
dis[i]=INF;
}
dis[S]=0;
q.push((Node){S,0});
while(!q.empty()){
Node tmp=q.top();
// cout<<tmp.u<<" "<<tmp.w<<'\n';
q.pop();
int x=tmp.u;
for(int i=first[x];i;i=e[i].nxt){
int v=e[i].v;
// cout<<e[i].w<<'\n';
if(dis[x]+e[i].w<dis[v]){
dis[v]=dis[x]+e[i].w;
q.push((Node){v,e[i].w+tmp.w});
}
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<=n;i++)
for(int j=1;j<=n;j++)
{
int x;
scanf("%d",&x);
if(i==0) add(i*n+j,T,x);
else if(i==n) add(S,i*n-n+j,x);
else add(i*n+j,i*n-n+j,x);
}
// cout<<"88888"<<endl;
for(int i=1;i<=n;i++)
for(int j=0;j<=n;j++)
{
int x;
scanf("%d",&x);
if(j==0)
add(S,i*n-n+1,x);
else
if(j==n)
add(i*n-n+j,T,x);
else
add(i*n-n+j,i*n-n+j+1,x);
}
for(int i=0;i<=n;i++)
for(int j=1;j<=n;j++)
{
int x;
scanf("%d",&x);
if(i==0)
add(T,i*n+j,x);
else
if(i==n)
add(i*n-n+j,S,x);
else
add(i*n-n+j,i*n+j,x);
}
for(int i=1;i<=n;i++)
for(int j=0;j<=n;j++)
{
int x;
scanf("%d",&x);
if(j==0)
add(i*n-n+1,S,x);
else
if(j==n)
add(T,i*n-n+j,x);
else
add(i*n-n+j+1,i*n-n+j,x);
}
dijkstra();
cout<<dis[T];
}