#2 WA 求调
查看原帖
#2 WA 求调
134066
Pethly_Cat楼主2022/7/22 11:04
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int n,s,t,c[N],f[N];
double dis[N];
bool vis[N];
struct node{
	int op,x,y,k;
}a[N];
vector<pair<int,double> > g[N];
void add(int x,int y,double z){
	g[x].push_back({y,z>0? log(z):-log(-z)});
}
bool check(double t){
	for(int i=0;i<=n;i++)
		g[i].clear();
	for(int i=1;i<=n;i++)
		if(c[i]) add(0,i,c[i]),add(i,0,-c[i]);
	for(int i=1;i<=s;i++){
		int op=a[i].op,x=a[i].x,y=a[i].y,k=a[i].k;
		if(c[x]&&c[y]&&((op==1&&c[x]<c[y]*(k-t))||(op==2&&c[x]*(k+t)<c[y]))) return true;
		if(op==1) add(x,y,t-k);
		if(op==2) add(x,y,k+t);
	}
	memset(f,0,sizeof(f));
	memset(vis,false,sizeof(vis));
	fill(dis+1,dis+n+1,1e18);
	queue<int> q;
	vis[0]=true,dis[0]=0;
	q.push(0);
	while(!q.empty()){
		int x=q.front(); q.pop();
		vis[x]=false;
		for(int i=0;i<g[x].size();i++){
			int y=g[x][i].first; double z=g[x][i].second;
			if(dis[y]>dis[x]+z){
				dis[y]=dis[x]+z;
				f[y]=f[x]+1;
				if(f[y]>n+1) return true;
				if(!vis[y]){
					vis[y]=true;
					q.push(y);
				}
			}
		}
	}
	return false;
}
int main(){
	scanf("%d%d%d",&n,&s,&t);
	for(int i=1;i<=s;i++)
		scanf("%d%d%d%d",&a[i].op,&a[i].x,&a[i].y,&a[i].k);
	for(int i=1;i<=t;i++){
		int x,y; scanf("%d%d",&x,&y);
		c[x]=y;
	}
	double l=0,r=1e9,mid=0; bool ok=false;
	while(r-l>1e-6){
		mid=(l+r)/2;
		if(check(mid)) l=mid,ok=true;
		else r=mid;
	}
	ok? printf("%lf",l):puts("-1");
	return 0;
}
2022/7/22 11:04
加载中...