求条
查看原帖
求条
1114241
vectorxyz楼主2024/9/30 21:28

spfa SLF+LLL 32pts

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

int n, m;
int a[10005][10005];
const int N = 1e5 + 5;
struct node
{
	int v, w;
};
vector<node> g[N];
int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1}, dist[N], s[N], t[N];
int id(int x, int y){return (x - 1) * m + y;}
bool vis[N];
void spfa(int s)
{
	deque<int> q;
	q.push_front(s);
	memset(vis, 0, sizeof(vis));	
	memset(dist, 0x3f, sizeof(dist));
	dist[s] = 0;
	vis[s] = 1;
	double sum = 0; int cnt = 1;
	while(q.size()){
		int u = q.front(); q.pop_front();
		if(cnt * dist[u] > sum){
			q.push_back(u);
			continue;
		}
		sum -= dist[u]; cnt -- ;
		vis[u] = 0;
		for(int i = 0;i < g[u].size();i ++ ){
			int v = g[u][i].v, w = g[u][i].w;
			if(dist[v] > dist[u] + w){
				dist[v] = dist[u] + w;
				if(!vis[v]){
					vis[v] = 1;
					sum += dist[v]; cnt ++ ;
					if(q.size() && dist[v] < dist[q.front()]) q.push_front(v);
					else q.push_back(v);
					// q.push(v);
				}
			}
		}
	}
}
signed main()
{
	int q;
	cin >> n >> m >> q;
	for(int i = 1;i <= n;i ++ ){
		for(int j = 1;j <= m;j ++ ){
			cin >> a[i][j];
		}
	}
	for(int i = 1;i <= n;i ++ ){
		for(int j = 1;j <= m;j ++ ){
			for(int k = 0;k < 4;k ++ ){
				int nx = i + dx[k], ny = j + dy[k];
				if(nx >= 1 && nx <= n && ny >= 1 && ny <= m){
					g[id(i, j)].push_back({id(nx, ny), a[i][j]});
				}
				if(a[i][j] + a[nx][ny] < 0 && nx >= 1 && nx <= n && ny >= 1 && ny <= m){
					// cout << a[i][j] << ' ' << a[nx][ny] << endl;
					puts("No");
					return 0;
				}
			}
		}
	}
	for(int i = 1;i <= q;i ++ ) cin >> s[i] >> t[i];
	int ans = LONG_LONG_MAX;
	for(int i = 1;i <= n * m;i ++ ){
		spfa(i);
		int maxn = LONG_LONG_MIN;
		for(int j = 1;j <= q;j ++ ){
			maxn = max(maxn, dist[id(s[j], t[j])] + a[s[j]][t[j]]);
		}
		ans = min(ans, maxn);
	}
	cout << ans << endl;
	return 0;
}
2024/9/30 21:28
加载中...