调一天了救救吧
查看原帖
调一天了救救吧
455515
wumingdeyu楼主2022/11/15 20:31

emmmm......

#include<bits/stdc++.h>
using namespace std;
inline void in(int &x)
{
	x=0;bool f=0;char c=getchar();
	while(c<'0'||c>'9') f=c=='-',c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
	x=f?-x:x;
}
const int N=1e4;
const double eps=1e-10;
int tot,head[N],cnt[N],n,s,t,scr[N],op,a,b,vis[N],k;
double dis[N],ans=-1,l=0.0,r=1000.0,mid;
struct edges1{
	int o,u,v,w;
}e1[N];
struct edges2{
	int v,nxt;
	double w;
}e2[N];
inline void add(int x,int y,double z)
{
	e2[++tot]={y,head[x],z},head[x]=tot;
}
inline bool spfa(int x)
{
	queue<int> q;
	while(!q.empty()) q.pop();
	memset(vis,0,sizeof(vis));
	memset(cnt,0,sizeof(cnt));
	memset(head,0,sizeof(head));
	for(int i=1;i<=n;i++) dis[i]=1;
	tot=0;

	for(int i=1;i<=s;i++)
	{
		if(scr[e1[i].u]&&scr[e1[i].v]&&((e1[i].o==1&&scr[e1[i].u]<scr[e1[i].v]*(e1[i].w-x))
		||(e1[i].o==2&&scr[e1[i].u]*(e1[i].w+x)<scr[e1[i].v]))) return 1;
		if(e1[i].o==1) add(e1[i].v,e1[i].u,e1[i].w-x);
		else if(e1[i].o==2) add(e1[i].v,e1[i].u,1.0/(e1[i].w+x));
	}
	for(int i=1;i<=n;i++)
	if(scr[i]) add(0,i,scr[i]),add(i,0,1.0/scr[i]);
	dis[0]=vis[0]=cnt[0]=1;
	q.push(0);
		for(int i=1;i<=n;i++)q.push(i);
	while(!q.empty())
	{
		int tmp=q.front();
		q.pop();
		vis[tmp]=0;
		for(int i=head[tmp];i;i=e2[i].nxt)
		{
			int to=e2[i].v,len=e2[i].w;
			if(dis[to]<dis[tmp]*len)
			{
				dis[to]=dis[tmp]*len;
				if(vis[to]==0)
				{
					q.push(to);
					vis[to]=1;
					if(++cnt[to]>n)
					{
						return 1;
					}
				}
			}
		}
	}
	return 0;
}
int main(){
	in(n),in(s),in(t);
	for(int i=1;i<=s;i++)in(op),in(a),in(b),in(k),e1[++tot]={op,a,b,k};
	for(int i=1;i<=t;i++) in(op),in(scr[op]);
	while(r-l>eps)
	{
		mid=(l+r)/2.0;
		if(spfa(mid)) l=mid+eps,ans=mid;
		else r=mid-eps;
	}
	if(ans==-1) printf("-1");
	else printf("%.10lf",ans);
	return 0;
}

2022/11/15 20:31
加载中...