站外题求助
  • 板块学术版
  • 楼主xingzhiyin
  • 当前回复12
  • 已保存回复12
  • 发布时间2025/7/23 11:10
  • 上次更新2025/7/23 15:49:18
查看原帖
站外题求助
1039058
xingzhiyin楼主2025/7/23 11:10

题目大意:给定一个nn个点mm条边有向无权图,求不经过第i(1~m)条边1到n的最短路长度。

蒟蒻代码的思路:找出最短路径上的所有边,如果第i条边不在最短路径中就直接输出原来的答案(即dis[n]dis[n]),否则就在跑一遍bfs求出答案。时间复杂度O(n(n+m))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;
}
2025/7/23 11:10
加载中...