社区讨论

站外题求助,全是RE

学术版参与者 3已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@lo8b7h7v
此快照首次捕获于
2023/10/27 15:46
2 年前
此快照最后确认于
2023/10/27 15:46
2 年前
查看原帖
题面
CPP
给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。
Input
第一行包含一个正整数n,表示点数。

接下来n行,每行包含两个整数x[i],y[i](0<=x[i],y[i]<=10^9),依次表示每个点的坐标。

Output
一个整数,即最小费用。

Sample Input
5
2 2
1 1
4 5
7 1
6 7
Sample Output
2
HINT
对于30%的数据,n<=1000

对于100%的数据,n<=200000

代码:
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
struct Edge{
	ll v,w,next;
	bool operator <(const Edge &a) const {
		return a.w<w;
	} 
}edg[200005];
ll n,m,tol=0,vis[200005],dis[200005],head[200005]={-1},x[200005],y[200005];
inline ll read(){
    bool flag=false;
    ll x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') flag=true;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    return flag?-x:x;
}
inline void write(ll x){
    if(x<0){
        x=~(x-1);
        putchar('-');
    }
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
inline void addedge(ll a,ll b,ll w){
	tol++;
	edg[tol].v=b;
	edg[tol].w=w;
	edg[tol].next=head[a];
	head[a]=tol;
}
inline void Dij(){
	priority_queue<Edge>q;
	for(ll i=0;i<=n;i++) dis[i]=inf,vis[i]=0;
	dis[1]=0;
	q.push(Edge{1,0,0});
	while(!q.empty()){
		ll u=q.top().v;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(ll i=head[u];i!=-1;i=edg[i].next){
			ll vq=edg[i].v,ww=edg[i].w;
			if(dis[vq]>dis[u]+ww){
				dis[vq]=dis[u]+ww;
				if(!vis[vq]) q.push(Edge{vq,dis[vq],0});
			}
		}
	}
}
int main(){
	n=read();
	for(ll i=1;i<=n;i++) x[i]=read(),y[i]=read(),head[i]=-1;
	for(ll i=1;i<=n;i++){
		for(ll j=i+1;j<=n;j++){
			addedge(i,j,min(abs(x[i]-x[j]),abs(y[i]-y[j])));
			addedge(j,i,min(abs(x[i]-x[j]),abs(y[i]-y[j])));
		}
	}
	Dij();
	write(dis[n]);
	return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...