題意:
有n個任務,如果時間來得及幹完某些任務後還可以接著幹別的任務,給乙個任務清單,問最少派出去多少人能完成所有任務。
思路:
比較簡單的追小路徑覆蓋問題了,在dag中找到最少的簡單路徑去覆蓋所有點,結論等於n-最大匹配數,可以這樣理解,最開始沒有邊任務都需要乙個人,共n個,然後只要有一條邊(幹完a活來的及幹b活那麼連邊ab),就有可能減少乙個人,當a-b a-c這樣的時候只能節省其中的一條,匹配也是,只能把a匹配給乙個,這樣說是不是很容易理解為什麼最小路徑覆蓋的結論是n-最大匹配數了吧。
#include
#include
#define n_node 500 + 10
#define n_edge 500 * 500 + 100
typedef struct
node;
typedef struct
star;
node node[n_node];
star e[n_edge];
int list[n_node] ,tot;
int mkgx[n_node] ,mkdfs[n_node];
void add(int a ,int b)
int dfs_xyl(int x)
}return 0;
}int abss(int x)
bool ok(int a ,int b)
int main ()
memset(list ,0 ,sizeof(list));
tot = 1;
for(i = 1 ;i <= n ;i ++)
for(j = i + 1 ;j <= n ;j ++)
memset(mkgx ,255 ,sizeof(mkgx));
int ans = 0;
for(i = 1 ;i <= n ;i ++)
printf("%d\n" ,n - ans);
}return 0;
}
poj2060 最小路徑覆蓋
題意 有n個任務 開始時間 起始地點 終止地點。每個地點可以派出一輛計程車,如果計程車完成任務i後還可以到達任務j,那麼它可以繼續執行任務j。現在問最少可以排除多少輛計程車?演算法 1 最小路徑覆蓋 2 在無圈有向圖中 最小路徑覆蓋 最大匹配數 3 建圖 如果任務i和任務j可以由一輛計程車共同執行,...
poj2060最小路徑覆蓋
俄羅斯套娃,如果i能裝到j裡面,則從i到j建一條有向邊,問最後能看到幾個娃娃,即需要多少條路徑能夠覆蓋到所有節點。include using namespace std const int oo 1e9 const int mm 111111 const int mn 999 int node,sr...
最小路徑覆蓋問題(最小路徑覆蓋)
本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...