P2868求调
  • 板块学术版
  • 楼主luminary3
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/9/21 16:57
  • 上次更新2023/11/2 18:52:37
查看原帖
P2868求调
689773
luminary3楼主2023/9/21 16:57

rt,

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e3+5;
struct edge{
	int to,w;
};
int n,m,s,cnt[N],p,f[N],x[N],y[N],z[N];
double dis[N];
bool vis[N];
vector<edge>e[N];
bool spfa()
{
    memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
		dis[i]=1e9;
	memset(cnt,0,sizeof(cnt));
	queue<int>q;
	for(int i=1;i<=n;i++)
		q.push(i);
	dis[s]=0;
	vis[s]=true;
	while(q.empty()==false)
	{
		int cur=q.front();
		vis[cur]=false;
		q.pop();
		for(int i=0;i<e[cur].size();i++)
		{
			int next=e[cur][i].to,w=e[cur][i].w;
			if(dis[cur]<dis[next]-w)
			{
				dis[next]=dis[cur]+w;
				cnt[next]=cnt[cur]+1;
				if(cnt[next]>=n)
					return true;
				if(vis[next]==false)
				{
					vis[next]=true;
					q.push(next);
				}
			}
		}
	}
	return false;
}
bool check(double w)
{
    for(int i=1;i<=n;i++)	
    	e[i].clear();
    for(int i=1;i<=m;i++)
        e[x[i]].push_back((edge){y[i],w*z[i]-f[x[i]]});
    return spfa();
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>f[i];
    for(int i=1;i<=m;i++)
        cin>>x[i]>>y[i]>>z[i];
    double l=0,r=1000;
    while(r-l>1e-6)
	{
        double mid=(l+r)/2;
        if(check(mid))
			l=mid;
        else 
			r=mid;
    }
	cout<<fixed<<setprecision(2)<<l;
    return 0;
}
2023/9/21 16:57
加载中...