AtCoder Beginner Contest 218 F Blocked Roads(并查集+搜索)
Posted CCSU_Cola
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 218 F Blocked Roads(并查集+搜索)相关的知识,希望对你有一定的参考价值。
题意:给出n个点和m条边,1-m条边会依次不可通过,求出每个边不可通过时,1-n的路径最小值。
思路:如果依次求最短路,时间复杂度为m*m*logn,显然是不可以的,于是我想到可以将最小生成树上的最短路求出来,那么该路径最长为n个点组成,也就是n-1条边,我们可以将这些边标记起来,然后如果删除的边不是其中的,则直接输出答案,否则在某条边不能通过的情况下重新跑一次bfs,时间复杂度为n*m。最小生成树上的最短路不一定是图上的最短路,但是能够保证如果图上存在最短路,则树上一定存在,树上存在最短路径,则路径长度最大为n-1。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct tt{
int x,to,val;
};
tt e[1000100];
int h[1010],idx=1;
struct node{
int x,y;
};
node p[1000100];
void add(int a,int b){
e[idx].x=b,e[idx].to=h[a],h[a]=idx++;
}
int dist[410],vis[410],flag[1000010],use[1000010],fa[410];
void bfs(){
memset(dist,-1,sizeof dist);
memset(vis,0,sizeof vis);
queue<int>q;
q.push(1);
dist[1]=0;
vis[1]=1;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=h[x];i!=-1;i=e[i].to){
if(flag[i])continue;
int j=e[i].x;
if(!vis[j]){
vis[j]=1;
q.push(j);
dist[j]=dist[x]+1;
}
}
}
}
void dfs(int x,int fa){
for(int i=h[x];i!=-1;i=e[i].to){
if(!flag[i])continue;
int j=e[i].x;
if(j==fa)continue;
dfs(j,x);
vis[x]|=vis[j];
}
}
void ddfs(int x,int fa){
for(int i=h[x];i!=-1;i=e[i].to){
if(!flag[i])continue;
int j=e[i].x;
if(j==fa)continue;
if(!vis[j])continue;
use[i]=1;
ddfs(j,x);
}
}
int find(int x){
if(fa[x]==x)return fa[x];
else return fa[x]=find(fa[x]);
}
int main(){
memset(h,-1,sizeof h);
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=m;i++){
scanf("%d%d",&p[i].x,&p[i].y);
add(p[i].x,p[i].y);
}
int ans=0;
for(int i=1;i<=m;i++){
int x=find(p[i].x);
int y=find(p[i].y);
if(x!=y){
flag[i]=1;//最小生成树用到的边
fa[x]=y;
ans++;
}
if(ans==n-1){
continue;
}
}
if(ans==n-1){
memset(vis,0,sizeof vis);
vis[n]=1;
dfs(1,-1);//标记最短路的点
ddfs(1,-1);//标记最短路的边
memset(flag,0,sizeof flag);
bfs();
int val=dist[n];
for(int i=1;i<=m;i++){
if(use[i]){
flag[i]=1;
bfs();
printf("%d\\n",dist[n]);
flag[i]=0;
}
else printf("%d\\n",val);
}
}
else{
for(int i=1;i<=m;i++){
printf("%d\\n",-1);
}
}
}
以上是关于AtCoder Beginner Contest 218 F Blocked Roads(并查集+搜索)的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Beginner Contest 115 题解