2007: [Noi2010]海拔

第一眼看,卧槽最小割水题,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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值