【悬赏关注1~2个】HELP!!!30PTS ONLY
查看原帖
【悬赏关注1~2个】HELP!!!30PTS ONLY
743014
_H17_楼主2023/12/6 20:40
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
const double EPS=1e-12; 
int n,m,k,head[N],tot,vis[N];
double l=0,r=11,mid,ans=-1,c[N],cnt[N],dis[N];
struct Edge{
    int nxt,tar;
    double w;
    Edge(int nxt=0,int tar=0,double w=0):nxt(nxt),tar(tar),w(w){}
}edge[N<<1];
struct Graph{
	int op,u,v;
	double w;
	Graph(int op=0,int u=0,int v=0,double w=0):op(op),u(u),v(v),w(w){}
}g[N<<1];
void add(int u,int v,double w){
    edge[++tot]=Edge(head[u],v,w),head[u]=tot;
    return;
}
bool spfa(double t){
	queue<int>q;
	memset(cnt,0,sizeof(cnt)),memset(vis,0,sizeof(vis)),memset(head,0,sizeof(head));
	tot=0;
	for(int i=1;i<=m;i++){
		if(g[i].op==1)
			add(g[i].v,g[i].u,g[i].w-t);
		else
			add(g[i].v,g[i].u,1.0/(g[i].w+t));
	}
	for(int i=1;i<=n;i++)
		if(c[i])
			add(0,i,c[i]),add(i,0,1.0/c[i]);
	for(int i=0;i<=n;i++){
		dis[i]=vis[i]=cnt[i]=1;
		q.push(i);
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u],v,w;i;i=edge[i].nxt){
			v=edge[i].tar,w=edge[i].w;
			if(dis[v]<dis[u]*w){
				dis[v]=dis[u]*w;
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
					if((++cnt[v])>n+1)
						return 0;
				}
			}
		}
		vis[u]=0;
	}
	return 1;
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
	for(int i=1,op,u,v;i<=m;i++){
	    double w;
		scanf("%d%d%d%lf",&op,&u,&v,&w);
		if(op==1)
			r=fmin(r,w);
		g[i]=Graph{op,u,v,w};
	}
	for(int i=1,id;i<=k;i++){
		double x;
		scanf("%d%lf",&id,&x);
		c[id]=x;
	}
	while(l+EPS<r){
		mid=(l+r)/2;
		if(spfa(mid))
			r=mid;
		else
			ans=l=mid;
	} 
	if(ans==-1)
		printf("-1");
	else
		printf("%.10lf",ans);
	return 0;
}

不知道为啥全是 -1。

2023/12/6 20:40
加载中...