最小路徑覆蓋

2021-05-26 16:29:46 字數 929 閱讀 6549

zoj 2521 led display

題意:七段數碼顯示器,乙個數碼上的7段燈可以選擇滅掉一些後重複使用這個數碼,

但滅掉的段不能再亮了。比如 6 可以 滅掉左小角的一段變成 5 來使用。

但自己不能重複使用,即最少滅一段才能再次使用。 現在按次序給出

乙個要現實的數碼序列,求需要的最少的燈數,使得能按所給的次序顯示所有數碼。

分析:先確定所有數碼可以通過滅掉一些段後形成的新數碼:

原數碼: 它可以形成的數碼

0 : 1 7

1 :2 :

3 : 1 7

4 : 1

5 :6 : 5

7 : 1

8 : 0 1 2 3 4 5 6 7 9

9 : 1 3 4 5 7

對於輸入的n長的序列,對第i個數,如果他後面的數j,可以由i形成,那麼連一條有向邊

i-j那麼問題轉化會在乙個有向無環圖上找最少的路徑數,有且僅有一次經過所有點。

而這個就是經典的最小路徑覆蓋問題了,可以用最大匹配來做,最小路徑數 = n - 最大匹

配數.**實現:

#include

#include

#include

using namespace std;

int dig=; //用7位二進位制表示乙個數碼,編號後對應位為1則表示該段亮。

int r[10][10];

void make() //這裡只是算出上面那個相互間形成關係的表。}}

#define maxn 1001

int num[maxn];

vector < int > g[maxn];

int sx[maxn],sy[maxn],vy[maxn];

int n;

int path(int p)

{for(int i=0,q;i

最小路徑覆蓋問題(最小路徑覆蓋)

本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...

最小路徑覆蓋

差不多是模板題了 分析 最小路徑覆蓋 n 最大匹配數 n為 總點數 因為匹配的點 相互 交叉形成一條條最長路徑 剩餘沒匹配的點需要進行就是需要匹配數 及 最小路徑覆蓋數 include using namespace std define maxn 1005 int match maxn int v...

最小路徑覆蓋

最小路徑覆蓋 最小路徑覆蓋 path covering 是 路徑 覆蓋 點 即用盡量少的不相交簡單路徑覆蓋有向無環圖g的所有頂點,即每個頂點嚴格屬於一條路徑,路徑的長度可能為0 單個點 最小路徑覆蓋數 g的點數 最小路徑覆蓋中的邊數。應該使得最小路徑覆蓋中的邊數盡量多,但是又不能讓兩條邊在同乙個頂點...