为什么T我三个
查看原帖
为什么T我三个
291604
王茗仟楼主2023/2/23 10:59
#include<bits/stdc++.h>
#define double long double
#define int128 __int128
#define int long long
#define re register
#define in inline
#define Pi pair<int,int>
#define vi vector<int>
#define max(a,b)  ((a)>(b)?a:b)
#define min(a,b)  ((a)<(b)?a:b)
#define ls x<<1
#define rs x<<1|1
#define mid (l+r>>1)
#define dx x+xx[i]
#define dy y+yy[i]
#define debug cout<<"wuyu"<<endl;
using namespace std;
const int INF=0x3f3f3f3f3f;
const int N=1e6+19;
const int M=1e6+10;
const int mod=998244353;
const double eps=1e-5;
in int read(){	re int x=0,f=0;re char c=getchar();	while(!isdigit(c)) f|=(c=='-'),c=getchar();	while(isdigit(c))  x=(x<<3)+(x<<1)+c-'0',c=getchar();	return f?-x:x;}
in void write(re int x){	if(x<0) putchar('-'),x=-x;	if(x>9) write(x/10);	putchar(x%10+'0');}


struct edge{
	int u,v,w;
	int nx;
}e[M];
int tot,head[N];

in void add(re int u,re int v,re int w){
	e[++tot].u=u;
	e[tot].v=v;
	e[tot].w=w;
	e[tot].nx=head[u];
	head[u]=tot;
}

int start,End;
int k;
int deep[N],dis[N];
bool vis[N];
int n,m;

struct node{
	int val,id;
	node(int x,int y){
		val=y;id=x;
	}
	
	bool operator < (const node &a)const{
		return val>a.val;
	}
};

priority_queue<node>q;

int dij(re int s){
	for(re int i=1;i<=End;i++){
		dis[i]=INF;
	}
	dis[s]=0;
	q.push(node(s,0));
	while(!q.empty()){
		re int u=q.top().id;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(re int i=head[u];i;i=e[i].nx){
			int v=e[i].v;
			if(dis[v]>dis[u]+e[i].w){
				dis[v]=dis[u]+e[i].w;
				if(!vis[v]){
					q.push(node(v,dis[v]));
				}
			}
		}
	}
	return dis[End];
}


signed main(){
	n=read();m=read();
	End=(2*n-2)*(m-1)+1;
	int w,u,v;
	for(re int i=1;i<m;i++){
		w=read();
		add(i*2,End,w);
	}
	for(re int i=2;i<n;i++){
		for(re int j=1;j<m;j++){
			w=read();
			u=2*(i-2)*(m-1)-1+2*j;
			v=2*(i-1)*(m-1)+2*j;
			add(u,v,w);add(v,u,w);
		}
		for(re int i=1;i<m;i++){
			w=read();
			v=2*(n-2)*(m-1)-1+2*i;
			add(start,v,w);
		}
	}
	for(re int i=1;i<n;i++){
		for(re int j=1;j<=m;j++){
			w=read();
			u=2*(i-1)*(m-1)-1+2*j;
			v=u-1;
			if(j==1) add(start,u,w);
			else if(j==m) add(v,End,w);
			else {
				add(u,v,w);add(v,u,w);
			}
		}
	}
	
	for(re int i=1;i<n;i++){
		for(re int j=1;j<m;j++){
			u=2*(i-1)*(m-1)-1+2*j;
			v=u+1;
			w=read();
			add(u,v,w);add(v,u,w);
		}
	}
	cout<<dij(0)<<endl;
	return 0;
	
	
	
}











2023/2/23 10:59
加载中...