萌新妹子,刚学oi图论,求调
查看原帖
萌新妹子,刚学oi图论,求调
774854
qzmoot楼主2024/10/3 18:12

我的写法和题解有点不一样,是在每个记录了每个矩形的范围,再和其他的点判断是否能进行连边

#include <bits/stdc++.h>
#define pb push_back
#define P pair<int,int>
#define mp make_pair
#define fi first
#define se second
using namespace std;
const int N=1005,inf=2e9;
int T;
int xs,ys,xt,yt;
int n;
int idx;
struct node{
	int x,y,hang,lie;
}a[N<<2];
bool cmp(node xx,node yy)
{
	return xx.x<yy.y;
}
int getlen(int i,int j)
{
	return abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y);
}
vector<int>e[N<<2],le[N<<2];
int book[N<<2],dis[N<<2];
priority_queue<P>q;
void add(int i,int j,int leg)
{
	e[i].pb(j),le[i].pb(leg);
	e[j].pb(i),le[j].pb(leg);
}
void dij()
{
	memset(book,0,sizeof book);
	memset(dis,0x3f,sizeof dis);
	dis[1]=0;
	q.push(mp(0,1));
	while(!q.empty())
	{
		int u=q.top().se;
		q.pop();
		if(book[u])
			continue;
		book[u]=1;
		for(int i=0;i<e[u].size();i++)
		{
			int v=e[u][i],w=le[u][i];
			if(dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				if(!book[v])
					q.push(mp(-dis[v],v));
			}
		}
	}
	if(dis[idx]==dis[0])
		puts("No Path");
	else
		printf("%d\n",dis[idx]);
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d%d%d",&xs,&ys,&xt,&yt,&n);
		idx=0;
		a[++idx]=(node){xs,ys,0,0};
		for(int i=1;i<=n;i++)
		{
			int _1,_2,_3,_4;
			scanf("%d%d%d%d",&_1,&_2,&_3,&_4);
			if(_1>_3)
				swap(_1,_3);
			if(_2<_4)
				swap(_2,_4);
			int hhh=_3-_1;
			int lll=_2-_4;
			int id1,id2,id3,id4;
			a[id1=++idx]=(node){_1,_2,hhh,-lll};//0
			a[id2=++idx]=(node){_1,_4,hhh,lll};//2
			a[id3=++idx]=(node){_3,_2,-hhh,-lll};//1
			a[id4=++idx]=(node){_3,_4,-hhh,lll}; //3
			add(id1,id2,getlen(id1,id2));
			add(id1,id3,getlen(id1,id3));
			add(id2,id4,getlen(id2,id4));
			add(id3,id4,getlen(id3,id4));
		}
		a[++idx]=(node){xt,yt,0,0};
		for(int i=1;i<=idx;i++)
			e[i].clear(),le[i].clear();
//		sort(a+1,a+1+idx,cmp);
		for(int i=1;i<=idx;i++)
		{
			int id=-1,maxlen=inf;
			for(int j=i+1;j<=idx;j++)
			{
				int lx=a[i].x,rx=a[i].x+a[i].hang;
				int ly=a[i].y,ry=a[i].y+a[i].lie;
				if(lx>rx)
					swap(lx,rx);
				if(ly>ry)
					swap(ly,ry);
				if(lx<=a[j].x && a[j].x<=rx)
				{
					int nowlen=getlen(i,j);
					if(maxlen>nowlen)
						maxlen=nowlen,id=j;
					continue;
				}
				if(ly<=a[j].y && a[j].y<=ry)
				{
					int nowlen=getlen(i,j);
					if(maxlen>nowlen)
						maxlen=nowlen,id=j;
					continue;
				}
				lx=a[j].x,rx=a[j].x+a[j].hang;
				ly=a[j].y,ry=a[j].y+a[j].lie;
				if(lx>rx)
					swap(lx,rx);
				if(ly>ry)
					swap(ly,ry);
				if(lx<=a[i].x && a[i].x<=rx)
				{
					int nowlen=getlen(i,j);
					if(maxlen>nowlen)
						maxlen=nowlen,id=j;
					continue;
				}
				if(ly<=a[i].y && a[i].y<=ry)
				{
					int nowlen=getlen(i,j);
					if(maxlen>nowlen)
						maxlen=nowlen,id=j;
					continue;
				}
			}
			if(id!=-1)
			{
				e[i].pb(id),le[i].pb(maxlen);
				e[id].pb(i),le[id].pb(maxlen);
			}
		}
		dij();
	}
	return 0;
}
2024/10/3 18:12
加载中...