题目大意:给定一个n个点m条边有向无权图,求不经过第i(1~m)条边1到n的最短路长度。
蒟蒻代码的思路:找出最短路径上的所有边,如果第i条边不在最短路径中就直接输出原来的答案(即dis[n]),否则就在跑一遍bfs求出答案。时间复杂度O(n(n+m))
蒟蒻的代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=405;
int n,m;
int u[N*N],v[N*N];
vector<int>vt[N];
int dis[N],pre[N],vis[N];
queue<int>q;
int f[N][N];
void bfs(int u,int v){
memset(vis,0,sizeof(vis));
memset(dis,-1,sizeof(dis));
memset(pre,0,sizeof(pre));
memset(f,0,sizeof(f));
q.push(1);
vis[1]=1;
dis[1]=0;
while(!q.empty()){
int x=q.front();
q.pop();
for(auto i:vt[x]){
if(x==u&&i==v)continue;
if(vis[i])continue;
dis[i]=dis[x]+1;
pre[i]=x;
vis[i]=1;
q.push(i);
}
}
return;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u[i]>>v[i];
vt[u[i]].push_back(v[i]);
}
bfs(0,0);
int ans_tmp=dis[n];
int t=n;
while(pre[t]!=1){
f[pre[t]][t]=1;
t=pre[t];
}
f[1][t]=1;
for(int i=1;i<=m;i++){
if(f[u[i]][v[i]]){
cout<<ans_tmp<<'\n';
continue;
}
bfs(u[i],v[i]);
cout<<dis[n]<<'\n';
}
return 0;
}