BZOJ 2007: [Noi2010]海拔
同1001一樣,對偶圖最小割轉最短路
又被卡spfa= =
話說為什么總是有些人總喜歡卡spfa,又好寫一般情況又快,為何老是要逼人寫迪杰斯特拉= =
要就題目直接說會卡spfa嘛
好吧其實是前幾天考試被spfa卡掉一半點發牢騷的= =不要介意= =
話說最近真的有些背,各種卡時卡空間(差2MB就過了的慘痛經歷啊QAQ)
好吧不說那么多了= =
CODE:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxk 510
#define maxn maxk*maxk
#define maxm maxn*4
#define inf 0x7fffffff
struct edges{
? ? int to,next,dist;
}edge[maxm];
struct node{
? ? int u,v;
};
bool operator < (node x,node y) {
return x.v>y.v;
}
int l,next[maxn];
void addedge(int x,int y,int z){
? ? edge[++l]=(edges){y,next[x],z};next[x]=l;
}
int dist[maxn],s,t;
bool b[maxn];
priority_queue<node > q;
int spfa(){
? ? for (int i=1;i<=t;i++) dist[i]=inf;
? ? dist[s]=0;
? ? q.push((node){s,0});
? ? while (!q.empty()) {
node x=q.top();q.pop();
int u=x.u;
if (b[u]) continue;
b[u]=1;
for (int i=next[u];i;i=edge[i].next)?
? ?if (dist[edge[i].to]>dist[u]+edge[i].dist) {
dist[edge[i].to]=dist[u]+edge[i].dist;
q.push((node){edge[i].to,dist[edge[i].to]});
? ?}
? ? }
? ? return dist[t];
}
int n,x,id[maxk][maxk],cnt;
int main(){
? ? scanf("%d",&n);
? ? n++;
? ? for (int i=1;i<n;i++)?
for (int j=1;j<n;j++) id[i][j]=++cnt;
? ? s=++cnt,t=++cnt;
? ? for (int i=1;i<=n;i++)?
for (int j=1;j<n;j++) {
? ?scanf("%d",&x);
? ?addedge(i==1?s:id[i-1][j],i==n?t:id[i][j],x);
}
? ? for (int i=1;i<n;i++)?
for (int j=1;j<=n;j++) {
? ?scanf("%d", &x);
? ?addedge(j==n?s:id[i][j],j==1?t:id[i][j-1],x);
}
? ? for (int i=1;i<=n;i++)?
for (int j=1;j<n;j++) {
? ?scanf("%d",&x);
? ?addedge(i==n?t:id[i][j],i==1?s:id[i-1][j],x);
}
? ? for (int i=1;i<n;i++)?
for (int j=1;j<=n;j++) {
? ?scanf("%d",&x);
? ?addedge(j==1?t:id[i][j-1],j==n?s:id[i][j],x);
}
? ? printf("%d\n",spfa());
? ? return 0;
}
轉載于:https://www.cnblogs.com/New-Godess/p/4348901.html
總結
以上是生活随笔為你收集整理的BZOJ 2007: [Noi2010]海拔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux安装技巧--安装Uuntu与w
- 下一篇: 评价一个人,就是要看他把时间都花在哪了