68pts求调,问题出在关于NO的判定,和题解对拍拍不出来
查看原帖
68pts求调,问题出在关于NO的判定,和题解对拍拍不出来
935976
Amoribus楼主2024/10/9 17:33
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF=9e15+10;
int sum[100009],ans=INF;
int n,m,q;
int a[100009];
vector<pair<int,int> > g[100009];
bool flag=1;
int dis[100009][59];
priority_queue< pair<int,int>,vector< pair<int,int> >,
			greater< pair<int,int> > > qu;
void dij(int st,int ret){
	qu.push(make_pair(dis[st][ret],st));
	while(!qu.empty()){
		int u=qu.top().second;
		qu.pop();
		for(int i=0;i<g[u].size();i++){
			int v=g[u][i].first;
			int w=g[u][i].second;
			if(dis[v][ret]>dis[u][ret]+w){
				dis[v][ret]=dis[u][ret]+w;
				qu.push(make_pair(dis[v][ret],v));
			}
		}
	}
}
signed main()
{
	for(int i=1;i<=100009;i++) sum[i]=-INF;
	ios::sync_with_stdio(0);
	cin>>n>>m>>q;
	for(int i=1;i<=n*m;i++) cin>>a[i];
	for(int i=1;i<=n*m;i++){
		if(i%m!=1&&a[i-1]+a[i]<0) flag=0; 
		if(i-m>=1&&a[i-m]+a[i]<0) flag=0; 
	}
	if(!flag){
		cout<<"No";
		return 0;
	}
	for(int i=1;i<=n*m;i++){
		if(i%m!=1) g[i].push_back(make_pair(i-1,a[i-1]));
		if(i%m!=0) g[i].push_back(make_pair(i+1,a[i+1]));
		if(i-m>=1) g[i].push_back(make_pair(i-m,a[i-m]));
		if(i+m<=n*m) g[i].push_back(make_pair(i+m,a[i+m]));  
	}
	for(int i=1;i<=q;i++){
		int x,y;
		cin>>x>>y;
		for(int j=1;j<=n*m;j++) dis[j][i]=INF;
		dis[m*(x-1)+y][i]=a[m*(x-1)+y];
		dij(m*(x-1)+y,i);
		for(int j=1;j<=n*m;j++){
			sum[j]=max(sum[j],dis[j][i]);
		}
	}
	for(int i=1;i<=n*m;i++){
		ans=min(ans,sum[i]);
	}
	cout<<ans<<endl;
	return 0;
}
2024/10/9 17:33
加载中...