#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int n, m, dis[N], book[N], cnt[N];
struct node {
int v, w;
};
vector<node>e[N];
void spfa(int s) {
memset(dis, 0xcf, sizeof(dis));
memset(cnt, 0, sizeof(cnt));
queue<int>q;
q.push(s);
dis[s] = 0;
cnt[s]++;
while (!q.empty()) {
int tmp = q.front();
q.pop();
for (int i = 0; i < e[tmp].size(); i++) {
int v = e[tmp][i].v;
int w = e[tmp][i].w;
if (dis[v] < dis[tmp] + w) {
dis[v] = dis[tmp] + w;
cnt[v]++;
q.push(v);
if (cnt[v] > n) {
cout << "Forever love" << endl;
exit(0);
}
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y, z;
cin >> x >> y >> z;
e[x].push_back({y, z});
}
int res = -1e9;
spfa(1);
res = max(res, dis[n]);
spfa(n);
res = max(res, dis[1]);
cout << -res << endl;
return 0;
}
for (int i = 0; i < e[tmp].size(); i++) {
int v = e[tmp][i].v;
int w = e[tmp][i].w;
if (arrive[v] > dis[tmp] + w) {
arrive[v] = dis[tmp] + w;
if (!in[v]) {
dis[v] = max(arrive[v], into[v]);
q.push({-dis[v], v});
}
}
}
for (int i = 0; i < g[tmp].size(); i++) {
int v = g[tmp][i];
in[v]--;
into[v] = max(into[v], dis[tmp]);
if (in[v] == 0) {
dis[v] = max(arrive[v], into[v]);
q.push({-dis[v], v});
}
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int n, m, u[N], v[N], w[N], f[N];
struct node {
int v, w, f;
};
vector<node>e[N];
int dis[N], book[N];
int res = 0;
void dijkstra(int x) {
for (int i = 1; i <= n; i++) {
book[i] = 0;
dis[i] = 1e9;
e[i].clear();
}
for (int i = 1; i <= m; i++) {
if (f[i] >= x) {
e[u[i]].push_back({v[i], w[i], f[i]});
e[v[i]].push_back({u[i], w[i], f[i]});
}
}
priority_queue<pair<int, int> >q;
q.push({0, 1});
dis[1] = 0;
while (!q.empty()) {
int tmp = q.top().second;
q.pop();
if (book[tmp])
continue;
book[tmp] = 1;
for (int i = 0; i < e[tmp].size(); i++) {
int v = e[tmp][i].v;
int w = e[tmp][i].w;
if (dis[v] > dis[tmp] + w) {
dis[v] = dis[tmp] + w;
q.push({-dis[v], v});
}
}
}
if (dis[n] < 1e9) {
int tmp = 1000000 * (double(x) / double(dis[n]));
res = max(res, tmp);
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y, z, flow;
cin >> u[i] >> v[i] >> w[i] >> f[i];
}
for (int i = 1; i <= 1000; i++) {
dijkstra(i);
}
cout << res << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n;
struct node {
double x, y;
} p[20];
double f[33000][16], dis[16][16];
void dp() {
int N = (1 << n) - 1;
for (int i = 0; i <= N; i++)
for (int j = 0; j <= n; j++) {
f[i][j] = 1e9;
}
f[0][0] = 0;
for (int i = 1; i <= n; i++) {
f[(1 << (i - 1))][i] = dis[0][i];
}
//枚举状态
for (int i = 1; i <= N; i++) {
//枚举当前位置
for (int j = 1; j <= n; j++) {
//判断当前位置是否合法
if ((i & (1 << (j - 1))) == 0)
continue;
//枚举上一步的位置
for (int k = 1; k <= n; k++) {
//判断上一步位置是否合法
if (k == j || (i & (1 << (k - 1))) == 0)
continue;
f[i][j] = min(f[i][j], f[i - (1 << (j - 1))][k] + dis[k][j]);
}
}
}
double res = 1e9;
for (int i = 1; i <= n; i++) {
res = min(res, f[N][i]);
}
cout << fixed << setprecision(2) << res << endl;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i].x >> p[i].y;
}
p[0] = {0, 0};
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= n; j++) {
dis[i][j] = sqrt((p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y));
}
}
dp();
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
char mat[N][N];
int pos[N][N], cnt, dis[16][16];
int n, m, book[N][N], vis[N][N];
int f[33000][16];
int nxt[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
struct node {
int x, y, cost;
friend bool operator < (node a, node b) {
return a.cost > b.cost;
}
};
void dfs(int x, int y) {
pos[x][y] = cnt;
for (int i = 0; i < 4; i++) {
int nx = x + nxt[i][0];
int ny = y + nxt[i][1];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && mat[nx][ny] == 'X' && pos[nx][ny] == 0) {
dfs(nx, ny);
}
}
}
void bfs(int x) {
priority_queue<node>q;
memset(book, 0x3f, sizeof(book));
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (pos[i][j] == x) {
q.push({i, j, 0});
book[i][j] = 0;
vis[i][j] = 1;
}
}
}
while (!q.empty()) {
node tmp = q.top();
q.pop();
for (int i = 0; i < 4; i++) {
int nx = tmp.x + nxt[i][0];
int ny = tmp.y + nxt[i][1];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m) {
if (mat[nx][ny] == 'S') {
if (book[nx][ny] > tmp.cost + 1 && vis[nx][ny] == 0) {
q.push({nx, ny, tmp.cost + 1});
book[nx][ny] = tmp.cost + 1;
vis[nx][ny] = 1;
}
} else if (mat[nx][ny] == 'X' && vis[nx][ny] == 0) {
if (book[nx][ny] > tmp.cost)
book[nx][ny] = tmp.cost, q.push({nx, ny, tmp.cost}), vis[nx][ny] = 1;
}
}
}
}
memset(dis[x], 0x3f, sizeof(dis[x]));
dis[x][x] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (mat[i][j] == 'X' && pos[i][j] != x) {
dis[x][pos[i][j]] = min(dis[x][pos[i][j]], book[i][j]);
}
}
}
}
void dp() {
memset(f, 0x3f, sizeof(f));
for (int i = 1; i <= cnt; i++) {
f[1 << (i - 1)][i] = 0;
}
int N = (1 << cnt) - 1;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= cnt; j++) {
if ((i & (1 << (j - 1))) == 0)
continue;
for (int k = 1; k <= cnt; k++) {
if (j == k || (i & (1 << (k - 1))) == 0)
continue;
f[i][j] = min(f[i][j], f[i - (1 << (j - 1))][k] + dis[k][j]);
}
}
}
int res = 0x3f3f3f3f;
for (int i = 1; i <= cnt; i++) {
res = min(res, f[N][i]);
}
cout << res << endl;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> mat[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (mat[i][j] == 'X' && pos[i][j] == 0) {
cnt++;
dfs(i, j);
}
}
}
for (int i = 1; i <= cnt; i++) {
bfs(i);
}
dp();
// for (int i = 1; i <= cnt; i++) {
// for (int j = 1; j <= cnt; j++) {
// cout << i << " " << j << " " << dis[i][j] << endl;
// }
// }
return 0;
}