做法比较神经,请大家谅解
#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;
}