1 条题解
-
1
#include<bits/stdc++.h> #define maxn 1200000 #define inf 2000000000 using namespace std; template<typename T> inline void read(T &x) { x=0;char c=getchar();bool flag=false; while(!isdigit(c)){if(c=='-')flag=true;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} if(flag) x=-x; } int n,s,t; struct edge { int to,nxt,v; }e[maxn]; int head[maxn],edge_cnt; void add(int from,int to,int val) { e[++edge_cnt]=(edge){to,head[from],val}; head[from]=edge_cnt; } int num(int x,int y) { return y+(x-1)*n; } struct node { int val,num; friend bool operator <(const node &x,const node &y) { return x.val>y.val; } }; priority_queue<node> q; int dis[maxn]; bool vis[maxn]; void dijkstra() { for(int i=s;i<=t;++i) dis[i]=inf; dis[s]=0; q.push((node){0,s}); while(!q.empty()) { node tmp=q.top(); q.pop(); int x=tmp.num; if(vis[x]) continue; vis[x]=true; for(int i=head[x];i;i=e[i].nxt) { int y=e[i].to,v=e[i].v; if(dis[y]>dis[x]+v) { dis[y]=dis[x]+v; q.push((node){dis[y],y}); } } } } int main() { read(n),n++; t=n*n+1; for(int i=1;i<=n;++i) { for(int j=1;j<n;++j) { int val; read(val); if(i==1) add(s,num(i,j),val); else if(i==n) add(num(i-1,j),t,val); else add(num(i-1,j),num(i,j),val); } } for(int i=1;i<n;++i) { for(int j=1;j<=n;++j) { int val; read(val); if(j==1) add(num(i,j),t,val); else if(j==n) add(s,num(i,j-1),val); else add(num(i,j),num(i,j-1),val); } } for(int i=1;i<=n;++i) { for(int j=1;j<n;++j) { int val; read(val); if(i==1) add(num(i,j),s,val); else if(i==n) add(t,num(i-1,j),val); else add(num(i,j),num(i-1,j),val); } } for(int i=1;i<n;++i) { for(int j=1;j<=n;++j) { int val; read(val); if(j==1) add(t,num(i,j),val); else if(j==n) add(num(i,j-1),s,val); else add(num(i,j-1),num(i,j),val); } } dijkstra(); printf("%d",dis[t]); return 0; }
- 1
信息
- ID
- 1006
- 时间
- 2000ms
- 内存
- 250MiB
- 难度
- 6
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者