http://acm.hdu.edu.cn/showproblem.php?pid=3870
最小割转最短路
#include<iostream>
#include<queue>
using namespace std;
#include<vector>
#define N 160001
#define M 1500001
#define inf 0x7fffffff
struct node{
int next,v;
int w;
node(){};
node(int a,int b,int c){
next=a;v=b;w=c;
}
}E[M];
int NE,head[N];
int map[401][401];
__int64 dis[N];
void init(){
NE=0;
memset(head,-1,sizeof(head));
}
void insert(int u,int v,int w){
E[NE]=node(head[u],v,w);
head[u]=NE++;
E[NE]=node(head[v],u,w);
head[v]=NE++;
}
bool update(int u,int v,int w){
if(dis[u]+w<dis[v]){
dis[v]=dis[u]+w;
return true;
}
return false;
}
struct cmp{
bool operator()(const int& a,const int& b){
return dis[a]>dis[b];
}
};
void dijkstra(int s,int e){
for(int i=0;i<=e;i++)
dis[i]=inf;
priority_queue<int,vector<int>,cmp> q;
dis[s]=0;
q.push(s);
while(!q.empty()){
int u=q.top();
q.pop();
if(u==e)
break;
for(int i=head[u];i!=-1;i=E[i].next){
int v=E[i].v;
if(update(u,v,E[i].w))
q.push(v);
}
}
printf("%I64d\n",dis[e]);
}
int GetInt(){
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
int num=0;
while(ch>='0'&&ch<='9'){
num=num*10+ch-'0';
ch=getchar();
}
return num;
}
int main(void){
int t,n;
scanf("%d",&t);
while(t--){
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=GetInt();
int beg=(n-1)*(n-1)+1,end=beg+1;
for(int i=1;i<=n-1;i++)
for(int j=1;j<=n-1;j++){
int u=(i-1)*(n-1)+j;
if(i==1)
insert(beg,u,map[i][j]);
if(j==1)
insert(u,end,map[i][j]);
if(i==n-1)
insert(u,end,map[i+1][j]);
if(j==n-1)
insert(beg,u,map[i][j+1]);
if(i<n-1)
insert(u,u+n-1,map[i+1][j]);
if(j<n-1)
insert(u,u+1,map[i][j+1]);
}
dijkstra(beg,end);
}
}