作业介绍

#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;
}
状态
已结束
题目
16
开始时间
2026-8-15 0:00
截止时间
2026-8-23 23:59
可延期
24 小时