-
B - Destroying Roads
- CodeForces - 543B
- 题意:给定s1,t1,l1,s2,t2,l2,问能够最多破坏多少条路仍然能够保证s1-t1<L1 ,s2-t2<L2
- 思路:为了让破坏的道路尽可能的多,那么留下的维护这两个关系的道路就得尽可能的小,
- 跑出所有任意两点的最短路,第一种情况,他们没有交点那么最终留下的维护关系的就是两条最短路径相加、
- 第二种情况是他们有公共部分时,这时最短路未必是最优解,然后枚举一下公共部分是哪些点时,
- 维护这两个关系的总边数最少,这里要注意不仅仅是
-
dis[s1][i]+dis[i][j]+dis[j][t1]与dis[s2][i]+dis[i][j]+dis[j][t2]
- 有可能有一条路是正者经过这条i,j路径,而另一条路则是反着经过这条j,i路径,但是都是经过的i-j之间的点
- 所以每条路需要在正反中取一个最小值:
-
min(dis[s1][i]+dis[i][j]+dis[j][t1],dis[t1][i]+dis[i][j]+dis[j][s1]);
-
min(dis[s2][i]+dis[i][j]+dis[j][t2],dis[t2][i]+dis[i][j]+dis[j][s2]);
- 在枚举过程中不要忘记维护那两个关系路径长度不可以超过l1,l2,然后动态维护ans最小值即可
-
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define maxn 3333 bool vis[maxn]; int pre[maxn],dis[maxn][maxn]; int cnt,m,a,b,head[maxn]; int s1,t1,l1,s2,t2,n,l2; struct edg { int v,w,to; } edge[maxn*maxn]; struct node { int ord,w; bool operator<(const node&b)const { return w>b.w; } } top; void add(int x,int y) { edge[++cnt].v=y; edge[cnt].w=1; edge[cnt].to=head[x]; head[x]=cnt; } void dij(int s) { priority_queue<node>q; for(int i=1; i<=n; i++) { vis[i]=0; dis[s][i]=inf; } dis[s][s]=0; vis[s]=1; q.push(node{s,0}); while(!q.empty()) { top=q.top(); q.pop(); for(int i=head[top.ord]; i!=-1; i=edge[i].to) { int v=edge[i].v; if(dis[s][v]>dis[s][top.ord]+1) { dis[s][v]=dis[s][top.ord]+1; pre[v]=top.ord; } if(!vis[v]) { vis[v]=1; q.push(node{v,dis[s][v]}); } } } } int main() { memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); int ans,flag=0; for(int i=0; i<m; i++) { scanf("%d%d",&a,&b); add(a,b); add(b,a); } scanf("%d%d%d",&s1,&t1,&l1); scanf("%d%d%d",&s2,&t2,&l2); for(int i=1; i<=n; i++) dij(i); if(dis[s1][t1]>l1||dis[s2][t2]>l2)flag=1; ans=dis[s1][t1]+dis[s2][t2]; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { int temp1=min(dis[s1][i]+dis[i][j]+dis[j][t1],dis[t1][i]+dis[i][j]+dis[j][s1]); int temp2=min(dis[s2][i]+dis[i][j]+dis[j][t2],dis[t2][i]+dis[i][j]+dis[j][s2]); if(temp1>l1||temp2>l2)continue; ans=min(ans,temp1+temp2-dis[i][j]); } if(flag)printf("-1\n"); else printf("%d\n",m-ans); return 0; }
B - Destroying Roads CodeForces - 543B -道路破坏问题
最新推荐文章于 2021-01-27 19:05:12 发布