2007: [Noi2010]海拔

来源:互联网 发布:小米5默认内存优化级别 编辑:程序博客网 时间:2024/05/17 02:32

第一眼看,卧槽最小割水题,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;}


1 0
原创粉丝点击