首先說一下題意,q個區域,m個任務,每個區域任務可能有多個,然後給你個到各地所需時間的矩陣,每個任務都有開始和持續時間,問最少需要多少工人? 每個工人只能同時執行乙個任務。
通過題意,我的瞬間反應就是先把點拆開再說,因為每個區域可能有多個任務,所以把每個任務都當做一點處理,之後就需要考慮一件事情,乙個工人在qi區域做完之後是不是應該去乙個離他最近且正好有任務的地方qj,那麼他從qi到qj是不是應該走最近的路線? 下一步就出來了,求出所有區域之間的最短距離,用floyd一鍵搞定。然後就可以建圖(有向的)了,把能銜接起來的任務統統連上,按照上乙個任務的開始時間+持續時間+到下一點的時間<=下一點的開始時間來連邊(不用換區域的到下一點的時間為零),那麼此時的問題就變成了多少個工人能把圖走完? 即最小路徑覆蓋,直接匈牙利演算法搞定。
好了上**
1 #include2 #include3 #include4 #include5view code#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 }
poj 3216 最小路徑覆蓋
題意 有n個地方,m個任務,每個任務給出地點,開始的時間和完成需要的時間,問最少派多少工人去可以完成所有的任務。給出任意兩點直接到達需要的時間,1代表不能到達。思路 很明顯的最小路徑覆蓋問題,剛開始腦子抽了,沒求最短路直接就做了,題目只給了兩點間直接到達的時間,還可以間接到達,用floyd求出最短路...
最小路徑覆蓋問題(最小路徑覆蓋)
本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...
poj2060 最小路徑覆蓋
題意 有n個任務 開始時間 起始地點 終止地點。每個地點可以派出一輛計程車,如果計程車完成任務i後還可以到達任務j,那麼它可以繼續執行任務j。現在問最少可以排除多少輛計程車?演算法 1 最小路徑覆蓋 2 在無圈有向圖中 最小路徑覆蓋 最大匹配數 3 建圖 如果任務i和任務j可以由一輛計程車共同執行,...