【GDKOI2004】使命的召唤
Description
你玩過call of duty這個游戲嗎?這個游戲以諾曼底登陸為背景,假設你是盟軍的一員,身在前線去完成許多任務而粉碎納粹的野心?,F在假設有一個任務,德軍有很多機槍陣地,火力很猛,如果不把它們摧毀就會對盟軍的推進造成很大損失,盟軍打算派出一些敢死隊員深入陣地把這些機槍陣地炸毀,當然,敢死隊員會有很大的生命危險,所以盟軍的指揮官希望你能幫他把損失降到最少。
Input
輸入數據第一行是一個整數n(1<=n<=200),代表有多少個機槍陣地需要摧毀。然后接下來n行,每行兩個整數xi,yi,代表每個機槍陣地的坐標(0<=xi,yi<=30000),然后接著一個整數m,跟著有m行,每行兩個整數p和q(1<=p,q<=n,p<>q),代表機槍陣地p和機槍陣地q之間有路相連,敢死隊員炸掉一個機槍陣地之后,必須從當前的機槍陣地出發沿著路到達下一個x坐標比當前陣地大的陣地(因為機槍陣地的縱深方向是沿著x坐標遞增方向的),如果不存在這樣的陣地,那這名敢死隊員就完成任務了。簡單來說,一個敢死隊員可以空降到任意一個機槍陣地(設為a0),然后從這個陣地出發按照上面所述可以摧毀一系列機槍陣地(順序列為a0,a1,a2…ak),而這一系列機槍陣地的x坐標滿足(x0 < x1 < x2 < … < xk)。從安全和效率出發,每個敢死隊員可以帶任意個炸彈。任意兩個敢死隊員的路線不能有交點?,F在問你怎么安排敢死隊員的路線,可以使到用最小數目的敢死隊員去完成這個艱巨的任務。
Output
輸出一個整數,就是所求的敢死隊員的最小數目。
Sample Input
4
25990 5850
8263 2957
1067 22231
4109 4577
3
4 1
2 4
1 3
Sample Output
2
Data Constraint
m<10000
Hint
解釋:
上面的例子最少需2個敢死隊員,1種方案是:1個摧毀陣地4后再去摧毀陣地2,1個敢死隊員摧毀陣地3后去摧毀陣地1。
.
.
.
.
.
分析
“交點”,并非是線與線的交點,不是計算幾何!!!
“任意兩個敢死隊員的路徑不能重復”是指一個點只走一次!!!
使用匈牙利算法
.
.
.
.
.
程序:
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int x[201],y[201],n,m,ans,g[401][401],f[401]; bool b[401];bool work(int t) {int i;for (i=n+1;i<=2*n;i++)if (g[t][i]&&!b[i]) {b[i]=1;if (!f[i]||work(f[i])==true) {f[i]=t; return 1;}}return 0; }int main() {cin>>n;for (int i=1;i<=n;i++)cin>>x[i]>>y[i];cin>>m;for (int i=1;i<=m;i++){int u,v;cin>>u>>v;if (x[u]>x[v]) swap(u,v);g[u][n+v]=1;}for (int i=1;i<=n;i++){memset(b,0,sizeof(b));if (work(i)==true) ans++;}cout<<n-ans; }轉載于:https://www.cnblogs.com/YYC-0304/p/9499921.html
總結
以上是生活随笔為你收集整理的【GDKOI2004】使命的召唤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【GDKOI2003】分球
- 下一篇: 【NOIP2013模拟9.29】密码