POJ3216 最小路徑覆蓋

2021-07-10 05:36:45 字數 1417 閱讀 5047

首先說一下題意,q個區域,m個任務,每個區域任務可能有多個,然後給你個到各地所需時間的矩陣,每個任務都有開始和持續時間,問最少需要多少工人? 每個工人只能同時執行乙個任務。

通過題意,我的瞬間反應就是先把點拆開再說,因為每個區域可能有多個任務,所以把每個任務都當做一點處理,之後就需要考慮一件事情,乙個工人在qi區域做完之後是不是應該去乙個離他最近且正好有任務的地方qj,那麼他從qi到qj是不是應該走最近的路線? 下一步就出來了,求出所有區域之間的最短距離,用floyd一鍵搞定。然後就可以建圖(有向的)了,把能銜接起來的任務統統連上,按照上乙個任務的開始時間+持續時間+到下一點的時間<=下一點的開始時間來連邊(不用換區域的到下一點的時間為零),那麼此時的問題就變成了多少個工人能把圖走完?  即最小路徑覆蓋,直接匈牙利演算法搞定。

好了上**

1 #include2 #include3 #include4 #include5

#define maxn 500

6#define inf 0xfffffff

7using

namespace

std;89

struct

edge

10rela[maxn];

13 vectorq[maxn];

14int

mize[maxn][maxn],point[maxn];

15int

vis[maxn],link[maxn];

16int

n,m,sum;

17void

init()

1830

31for(int c=1;c<=m;c++)

3239 rela[c].realpos=rela[c].pos+n*p;

40 point[rela[c].realpos]=1;41

if(sumrela[c].realpos;42}

43}44void

floyd()

4554}55

}565758}59

void

set_map()

6074}75

}76/*for(int i=1;i<=8;i++)

7784

cout<85}*/

86}87int dfs(int

x)88

100}

101}

102return

false

;103

}104

void

solve()

105114 printf("

%d\n

",m-s);

115}

116int

main()

117127

return0;

128 }

view code

poj 3216 最小路徑覆蓋

題意 有n個地方,m個任務,每個任務給出地點,開始的時間和完成需要的時間,問最少派多少工人去可以完成所有的任務。給出任意兩點直接到達需要的時間,1代表不能到達。思路 很明顯的最小路徑覆蓋問題,剛開始腦子抽了,沒求最短路直接就做了,題目只給了兩點間直接到達的時間,還可以間接到達,用floyd求出最短路...

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

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

poj2060 最小路徑覆蓋

題意 有n個任務 開始時間 起始地點 終止地點。每個地點可以派出一輛計程車,如果計程車完成任務i後還可以到達任務j,那麼它可以繼續執行任務j。現在問最少可以排除多少輛計程車?演算法 1 最小路徑覆蓋 2 在無圈有向圖中 最小路徑覆蓋 最大匹配數 3 建圖 如果任務i和任務j可以由一輛計程車共同執行,...