DFS-SPFA TLE 2pts求条
查看原帖
DFS-SPFA TLE 2pts求条
742017
zhangxiao666楼主2024/7/24 19:45
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
const int N = 3010;
const int M = 2e4 + 10;
int n, m, cnt, flag;
int head[N], nxt[M], to[N];
double w[M];
int vis[N];
double dis[N];

int read()
{
    int f=1,x=0;
    char ss=getchar();
    while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
    while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
    return f*x;
}

void Add(int x, int y, double z)
{
	nxt[++cnt] = head[x];
	to[cnt] = y;
	w[cnt] = z;
	head[x] = cnt;
}

void Dfs_Spfa(int u, double x)
{
	vis[u] = 1;
	for (int i = head[u]; i; i = nxt[i])
	{
		int v = to[i];
		if (dis[v] > dis[u] + w[i] - x)
		{
			if (vis[v] || flag) {flag = 1; return;}
			dis[v] = dis[u] + w[i] - x;
			Dfs_Spfa(v, x); 
		}
	}
	vis[u] = 0;
}

bool Check(double mid)
{
	flag = 0;
	for (int i = 1; i <= n; i++) vis[i] = 0,  dis[i] = 0;
	for (int i = 1; i <= n; i++)
	{
		Dfs_Spfa(i, mid);
		if (flag) return 0; 
	}
	return 1;
}

int main()
{
	n = read(), m = read();
	for (int i = 1; i <= m; i++)
	{
		int x, y; double z;
		x = read(), y = read();
		scanf("%lf", &z); 
		Add(x, y, z);
	}
	double l = -1e6, r = 1e6;
	while (r - l > eps)
	{
		double mid = (l + r) / 2;
		if (Check(mid)) l = mid;
		else r = mid;
	}
	printf("%.8lf", l);
	return 0;
}

2024/7/24 19:45
加载中...