做网站的会什么,网络服务提供者知道或者应当知道网络用户利用其网络,怎么建设网站电话,东营网站关键词正题
题面链接:https://gmoj.net/senior/#main/show/5057 题目大意 n∗mn*mn∗m的网格上有一些炮和敌军#xff0c;每个炮可以攻击在它方向上一个敌军#xff0c;但是要求炮弹的轨迹不能交叉。求最多打死多少敌军。 解题思路
我们先把炮分成两类#xff0c;一类是横着打每个炮可以攻击在它方向上一个敌军但是要求炮弹的轨迹不能交叉。求最多打死多少敌军。 解题思路
我们先把炮分成两类一类是横着打定义为正类一类是竖着打定义为负类那么肯定是两类不同的轨迹交叉。 我们对于每个炮弹它每走一格可能能够多打一些敌方我们可以把这个多大的定义为这个点的权值。显然对于每一类格子都会有一个权值。
然后我们大致构建一个这样的图炮1的第二个与炮2的第二个有交叉
割掉权值为www这里的www统指那个点在那一类的权值的边表示不选择这个点正类的边连向炮的方向是因为如果我们要让交叉的那条边不生效也就是要把后面三个的www权值舍弃那么就表示炮弹不会打到后面那三个反类的边从炮弹出去也是一个原理我们要求舍去的一定是一个后缀
然后这就是一个经典的最大权闭合图模板了上网络流即可。 codecodecode
#includecstdio
#includecstring
#includealgorithm
#includequeue
using namespace std;
const int N6000,inf2147483647/3;
const int dx[4]{-1,1,0,0},dy[4]{0,0,-1,1};
struct node{int to,next,w;
}a[N8];
int n,m,tot,s,t,cnt,ans;
int dep[N],ls[N];
int v[51][51],wv[51][51];
queueint q;
void addl(int x,int y,int w){if(!w)return;a[tot].toy;a[tot].nextls[x];ls[x]tot;a[tot].ww;a[tot].tox;a[tot].nextls[y];ls[y]tot;a[tot].w0;return;
}
bool bfs(){memset(dep,0,sizeof(dep));dep[s]1;while(!q.empty())q.pop();q.push(s);while(!q.empty()){int xq.front();q.pop();for(int ils[x];i;ia[i].next){int ya[i].to;if(dep[y]||!a[i].w)continue;dep[y]dep[x]1;if(yt)return 1;q.push(y);}}return 0;
}
int dinic(int x,int flow){int rest0,k;if(xt)return flow;for(int ils[x];i;ia[i].next){int ya[i].to;if(dep[x]1!dep[y]||!a[i].w)continue;rest(kdinic(y,min(flow-rest,a[i].w)));a[i].w-k;a[i^1].wk;if(restflow)return flow;}if(!rest)dep[x]0;return rest;
}
int main()
{scanf(%d%d,n,m);s0;tcnttot1;for(int i1;in;i)for(int j1;jm;j)scanf(%d,wv[i][j]);for(int i1;in;i)for(int j1;jm;j){int tmp0,xi,yj;if(wv[x][y]0){int k-wv[x][y]-1,lastcnt,tmpp0;if(k1)continue;while(1){xdx[k];ydy[k];if(x1||y1||xn||ym)break;tmpmax(tmp,wv[x][y]);cnt;addl(s,cnt,tmp-tmpp);if(last)addl(cnt,last,inf);tmpptmp;lastv[x][y]cnt;}anstmp;}}for(int i1;in;i)for(int j1;jm;j){int tmp0,xi,yj;if(wv[x][y]0){int k-wv[x][y]-1,lastcnt,tmpp0;if(k2)continue;while(1){xdx[k];ydy[k];if(x1||y1||xn||ym)break;tmpmax(tmp,wv[x][y]);cnt;addl(cnt,t,tmp-tmpp);if(last)addl(last,cnt,inf);if(v[x][y])addl(v[x][y],cnt,inf);tmpptmp;lastcnt;}anstmp;}}while(bfs())ans-dinic(s,inf);printf(%d\n,ans);return 0;
}