标签:dij int gy 雷雨 P6833 maxn gx Cnoi2020 dis
枚举三条路径重合点,跑dij。预处理出三个点到每个点的最短路。因为事无向边,所以就事每个点到这三个点的最短路。
\(O(nm\log (nm))\)
另外,我的点拆边光荣的挂掉了。
不过可以方格dij。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int cnt=0,ans=0x3f3f3f3f3f3f3f3f;
const int maxn=1e3+5;
int n,m,a,b,c;
int W[maxn][maxn];
int dis[maxn][maxn],adis[maxn][maxn];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
struct node{
int x,y,w;
node(){}
node(int a,int b,int c):x(a),y(b),w(c){}
bool operator <(const node &b)const{return w>b.w;}
};
void dij(int x,int y){//方格最短路,spfa的噩梦
memset(dis,0x3f3f3f3f,sizeof(dis));
priority_queue<node> q;
q.push((node){x,y,W[x][y]});
dis[x][y]=W[x][y];
while(!q.empty()){
int nx=q.top().x,ny=q.top().y,d=q.top().w;
q.pop();
if(d!=dis[nx][ny])continue;
for(int i=0;i<4;i++){
int gx=nx+dx[i],gy=ny+dy[i];
if(gx<1||gx>n||gy<1||gy>m)continue;
if(dis[gx][gy]>dis[nx][ny]+W[gx][gy]){
dis[gx][gy]=dis[nx][ny]+W[gx][gy];
q.push((node){gx,gy,dis[gx][gy]});
}
}
}
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)adis[i][j]+=dis[i][j];
}
signed main(){
cin>>n>>m>>a>>b>>c;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>W[i][j];
dij(1,a),dij(n,b),dij(n,c);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans=min(ans,adis[i][j]-2*W[i][j]);
}
}
cout<<ans;
return 0;
}
标签:dij,int,gy,雷雨,P6833,maxn,gx,Cnoi2020,dis 来源: https://www.cnblogs.com/kkksc0100/p/p6833-cnoi2020-storm.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。