本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋=節點數-二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。
然後麻煩就在於本題也要輸出路徑,所以再寫乙個dfs函式。從建的起點開始,每次如果可以向後面走,並且流量為0,說明有路徑,就可以繼續找,注意此時每次dfs找到的是終點邊,因為每次dfs要從起點開始,所以重新dfs時要從找到的點-n的點開始dfs,用乙個佇列記下找到的點的順序,最後for迴圈輸出就行。
**如下:
#include #include #include #include #include #include #include #include #include #include #define m 211*211
#define inf 0x7fffffff
#define st 1000
#define ed 2000
using namespace std;
int n,m;
int num=0;
int p[m];
int q[4*m];
int level[m];
struct node
str1[m];
void add(int x,int y,int z)
void init()
}bool makelevel(int st,int ed)
}int main()
printf("%d\n",n-ans);
return 0;
}
最小路徑覆蓋
zoj 2521 led display 題意 七段數碼顯示器,乙個數碼上的7段燈可以選擇滅掉一些後重複使用這個數碼,但滅掉的段不能再亮了。比如 6 可以 滅掉左小角的一段變成 5 來使用。但自己不能重複使用,即最少滅一段才能再次使用。現在按次序給出 乙個要現實的數碼序列,求需要的最少的燈數,使得能...
最小路徑覆蓋
差不多是模板題了 分析 最小路徑覆蓋 n 最大匹配數 n為 總點數 因為匹配的點 相互 交叉形成一條條最長路徑 剩餘沒匹配的點需要進行就是需要匹配數 及 最小路徑覆蓋數 include using namespace std define maxn 1005 int match maxn int v...
最小路徑覆蓋
最小路徑覆蓋 最小路徑覆蓋 path covering 是 路徑 覆蓋 點 即用盡量少的不相交簡單路徑覆蓋有向無環圖g的所有頂點,即每個頂點嚴格屬於一條路徑,路徑的長度可能為0 單個點 最小路徑覆蓋數 g的點數 最小路徑覆蓋中的邊數。應該使得最小路徑覆蓋中的邊數盡量多,但是又不能讓兩條邊在同乙個頂點...