50pts求助
查看原帖
50pts求助
561949
syr1125楼主2024/7/6 15:26

做法比较神经,请大家谅解

#include <bits/stdc++.h>
using namespace std;

int n, m;
int vis[1005], dfn[1005], t = 0, flag = 0, visans[1005];
double k[1005], b[1005], a[1005][1005], ans[1005];

void getans(int now)
{
	for (int i = 1; i <= n; i ++)
	{
		if (!visans[i] && a[now][i] >= 0)
		{
			ans[i] = a[now][i] - ans[now];
			//cout << i << " " << ans[i] << " " << now << " " << ans[now] << endl;
			visans[i] = 1;
			getans(i);
		}
	}
}

void dfs(int now)
{
	if (flag) return;
	if (!dfn[now]) dfn[now] = ++ t;
	for (int i = 1; i <= n; i ++)
	{
		if (!vis[i] && a[now][i] >= 0)
		{
			//cout << now << "to" << i << endl;
			vis[i] = 1;
			k[i] = -k[now], b[i] = a[now][i] - b[now];
			dfs(i);
		}
		else if (vis[i] && dfn[i] + 1 < dfn[now])
		{
			//cout << dfn[now] << " " << dfn[i] << " " << now << " " << i << " " << k[now] << " " << k[i] << " " << b[now] << " " << b[i] << " " << k[2] << endl;
			if (k[now] == -k[i])
			{
				cout << "IMPOSSIBLE";
				exit(0);
			}
			ans[i] = (a[now][i] - b[i] - b[now]) / (k[i] + k[now]);
			visans[i] = 1;
			getans(i);
			flag = 1;
			return;
		}
	}
}

int main()
{
	memset(a, -1, sizeof a);
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= m; i ++)
	{
		int x, y;
		double z;
		scanf("%d %d %lf", &x, &y, &z);
		a[x][y] = z, a[y][x] = z;
	}

	for (int i = 1; i <= n; i ++)
	{
		if (!vis[i] && !visans[i])
		{
			flag = 0;
			k[i] = 1, b[i] = 0, vis[i] = 1;
			dfs(i);
		}
	}

	for (int i = 1; i <= n; i ++)
	{
		for (int j = 1; j <= n; j ++)
		{
			if (a[i][j] >= 0 && ans[i] + ans[j] != a[i][j])
			{
				cout << "IMPOSSIBLE";
				return 0;
			}
		}
	} 
	
	for (int i = 1; i <= n; i ++)
	{
		printf("%.2lf\n", ans[i]);
	}
	return 0;
}
2024/7/6 15:26
加载中...