qwq題目太長 這裡就不複製了題目
這個題…算是個比較經典的平面圖最小割變成對偶圖的最短路了qwq
首先考慮最小割應該怎麼做。
有乙個性質,就是每個點的海拔要麼是1,要麼是0
qwq不過這個我不會證明啊
那麼既然知道了這個性質,我們對於地圖上的每個點,實際上就是劃分成兩個集合,乙個是
1 1
,乙個是
0' role="presentation" style="position: relative;">00
那麼直接最小割就行了
// luogu-judger-enable-o2
#include
#include
#include
#include
#include
#include
using
namespace
std;
inline
int read()
while (isdigit(ch))
return x*f;
}const
int maxn = 110*110;
const
int maxm = 1e6+1e2;
const
int inf = 1e9;
int point[maxn];
int nxt[maxm],to[maxm],val[maxm];
int cnt=1;
int h[maxn];
queue
q;int n,m;
int s,t;
void addedge(int x,int y,int w)
void insert(int x,int y,int w)
bool bfs(int s)}}
if (h[t]==-1) return
false;
else
return
true;
}int dfs(int x,int low)
}if (low>0) h[x]=-1;
return totflow;
}int dinic()
return ans;
}int main()
} for (int i=1;ifor (int j=1;j<=n;j++)
for (int i=1;i<=n;i++)
}for (int i=1;ifor (int j=1;j<=n;j++)
cout
0;}
不過這個最小割的複雜度是**的,顯然沒法通過這個題,那麼我們這時候就需要用到乙個很關鍵的性質了
平面圖最小割等於對偶圖的最短路
那麼什麼是對偶圖呢?
簡單來說,就是把原圖的每個封閉面,看成乙個點,然後原圖的每一種割,對應著新圖s到
t s到t
的一條路徑
但是qwq這裡先留跟個坑,就是關於邊的方向的問題….這裡還不是很理解呢
轉化成新圖,建好圖之後,直接從
s s
開始跑最短路,di
s[t]
' role="presentation" style="position: relative;">dis
[t]d
is[t
]就是答案
一般原圖的st和新圖的st成對角線的關係
#include
#include
#include
#include
#include
#define pa pair
#include
using
namespace
std;
inline
long
long read()
while (isdigit(ch))
return x*f;
}const
int maxn = 510;
const
int n = maxn*maxn;
const
int maxm = 2e6+1e2;
int a[maxn][maxn][maxn];
int point[n],nxt[maxm],to[maxm];
int cnt;
int vis[n];
int n,m;
long
long dis[n],val[maxm];
priority_queuevector
,greater> q;
int s,t;
void addedge(int x,int y,long
long w)
void splay(int s)}}
}inline
int getnum(int x,int y)
int main()
for (int i=1;ifor (int j=1;j<=n;j++)
for (int i=1;i<=n;i++)
for (int j=1;jlong
long x=read();
addedge(getnum(i-1,j),getnum(i,j),x);
} for (int i=1;ifor (int j=1;j<=n;j++)
splay(s);
cout
0;}
洛谷2046 NOI2010海拔
qwq題目太長 這裡就不複製了 題目這個題.算是個比較經典的平面圖最小割變成對偶圖的最短路了qwq 首先考慮最小割應該怎麼做。有乙個性質,就是每個點的海拔要麼是1,要麼是0 qwq不過這個我不會證明啊 那麼既然知道了這個性質,我們對於地圖上的每個點,實際上就是劃分成兩個集合,乙個是 1 乙個是 0 ...
洛谷 P2048 NOI2010 超級鋼琴
給出乙個序列,求和最大的k個連續子串行的和,且連續子串行長度在l與r之間.首先預處理出字首和,我們可以從左端點開始考慮,若左端點為i,則右端點在i l 1與i r 1之間,那麼可以計算出這些區間的最大值,然後放到堆裡去,每次從堆中取出最大值加到ans中後再將該區間左右兩區間的最大值放入堆中.也就是說...
洛谷P2048 NOI2010 超級鋼琴 題解
近期發現這篇題解有點爛,更新一下,刪繁就簡,詳細重點。多加了注釋。就醬紫啦!我們需要先算美妙度的字首和,並初始化rmq。迴圈 i 從 1 到 n 因為以i為起點的和弦終點必定是 i l 1 到 i r 1 之間,所以只要在區間內用rmq取超級和弦,並加入以美妙度從小排到大的優先佇列中。取出堆頂元素,...