求助
查看原帖
求助
1125850
_liyuze_楼主2024/12/30 20:04
#include<bits/stdc++.h>
using namespace std;
int n,m,u,v;
int cnt[3005];
bool vis[3005];
double dist[3005];
double t,L=-5e4,R=5e4,mid;
struct node{int to;double t,now;};
vector<node> edge[3005];
bool spfa(){
	queue<int> q;
	for(int i=2;i<=n;i++) dist[i]=1e8;
	memset(cnt,0,sizeof cnt);
	memset(vis,0,sizeof vis);
	q.push(1);
	cnt[1]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(node y:edge[x]){
			if(dist[y.to]-(dist[x]+y.now)>0){
				dist[y.to]=dist[x]+y.now;
				cnt[y.to]++;
				if(cnt[y.to]==n) return 1;
				if(!vis[y.to]){
					vis[y.to]=1;
					q.push(y.to);
				}
			}
		}
	}
	return 0;
}
bool check(double mid){
	for(int i=1;i<=n;i++){
		for(int j=0;j<edge[i].size();j++){
			edge[i][j].now=edge[i][j].t-mid;
		}
	}
	return spfa();
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>t;
		edge[u].push_back({v,t,0});
	}
	while(1e-10<R-L){
		mid=(L+R)/2;
		if(check(mid)) R=mid;
		else L=mid;
	}
	cout<<fixed<<setprecision(8)<<R;
	return 0;
}

上面这份代码能过

#include<bits/stdc++.h>
using namespace std;
int n,m,u,v;
int cnt[3005];
bool vis[3005];
double dist[3005];
double t,L=-1e5,R=1e5,mid;
struct node{int to;double t,now;};
vector<node> edge[3005];
bool spfa(){
	queue<int> q;
	for(int i=2;i<=n;i++) dist[i]=1e8;
	memset(cnt,0,sizeof cnt);
	memset(vis,0,sizeof vis);
	q.push(1);
	cnt[1]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(node y:edge[x]){
			if(dist[y.to]-(dist[x]+y.now)>0){
				dist[y.to]=dist[x]+y.now;
				cnt[y.to]++;
				if(cnt[y.to]==n) return 1;
				if(!vis[y.to]){
					vis[y.to]=1;
					q.push(y.to);
				}
			}
		}
	}
	return 0;
}
bool check(double mid){
	for(int i=1;i<=n;i++){
		for(int j=0;j<edge[i].size();j++){
			edge[i][j].now=edge[i][j].t-mid;
		}
	}
	return spfa();
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>t;
		edge[u].push_back({v,t,0});
	}
	while(1e-10<R-L){
		mid=(L+R)/2;
		if(check(mid)) R=mid;
		else L=mid;
	}
	cout<<fixed<<setprecision(8)<<R;
	return 0;
}

这份过不了

区别:L,R初始范围

为啥啊?

2024/12/30 20:04
加载中...