第一眼看,卧槽最小割水题,nice秒A。
然后交上去。
?
?
?
TLE???
!!!!!
好吧数据范围我吃了。
不过好奇怪为什么之前1001的时候用最小割过了。
然后还是乖乖地去学了下对偶图,就是周冬神犇的论文。
然后就写了个Dijkstra A了,700多MS,不敢写SPFA了,TLE出阴影了(辛普森积分求阴影面积233333)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=500+5;
struct Heapnode{
int x,d;
bool operator<(const Heapnode &rhs)const{
return d>rhs.d;
}
};
struct Edge{int to,next,v;}e[N*N*4];
int head[N*N],cnt,node[N][N],sz,d[N*N];
bool done[N*N];
void ins(int u,int v,int w){
cnt++;e[cnt].to=v;e[cnt].next=head[u];e[cnt].v=w;head[u]=cnt;
}
void Dijkstra(int s){
memset(d,0x3f,sizeof(d));
memset(done,false,sizeof(done));
priority_queue<Heapnode>q;
d[s]=0;q.push((Heapnode){s,0});
while(!q.empty()){
Heapnode x=q.top();q.pop();
int u=x.x;if(done[u])continue;done[u]=true;
for(int i=head[u];i;i=e[i].next)
if(d[e[i].to]>d[u]+e[i].v){
d[e[i].to]=d[u]+e[i].v;
q.push((Heapnode){e[i].to,d[e[i].to]});
}
}
}
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)node[i][j]=++sz;
int T=++sz,S=0;
for(int i=1;i<=n;i++)node[i][0]=T;
for(int i=1;i<=n;i++)node[n+1][i]=T;
int x;
for(int i=1;i<=n+1;i++)
for(int j=1;j<=n;j++){
scanf("%d",&x);
ins(node[i-1][j],node[i][j],x);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++){
scanf("%d",&x);
ins(node[i][j],node[i][j-1],x);
}
for(int i=1;i<=n+1;i++)
for(int j=1;j<=n;j++){
scanf("%d",&x);
ins(node[i][j],node[i-1][j],x);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++){
scanf("%d",&x);
ins(node[i][j-1],node[i][j],x);
}
Dijkstra(S);
printf("%d",d[T]);
return 0;
}