求助优化
查看原帖
求助优化
257563
Harry_8810楼主2020/12/26 20:34

我用迪杰斯特拉做的,就一个点多了6ms,求优化

#include<bits/stdc++.h>
using namespace std;
int n,m,s;
const int MAXNUM=1004005;
struct inin
{
	int to;
	int next;
	int num;
}mp[MAXNUM];
int tot=0;
int head[MAXNUM],dis[MAXNUM];
bool vis[MAXNUM];
inline void NEW(int from,int to,int num)
{
 //   cout<<from<<' '<<to<<' '<<num<<endl;
	tot++;
	mp[tot].num=num;//dis 
	mp[tot].to=to;
	mp[tot].next=head[from];
	head[from]=tot;
} 
struct node
{
	int dis;
	int pos;
	bool operator < (const node &x)const 
	{
		return x.dis<dis;
	}
};
priority_queue<node> Q;
inline void djstl()
{
	dis[s]=0;
	Q.push((node){0,s});
	while(!Q.empty())
	{
		node TOP=Q.top();
		Q.pop();
		int first=TOP.pos,second=TOP.dis;
		if(vis[first]==true)
		{
			continue;
		}
		vis[first]=true;
		for(register int i=head[first];i;i=mp[i].next)
		{
			int TOT=mp[i].to;
			if(dis[TOT]>dis[first]+mp[i].num)
			{
				dis[TOT]=dis[first]+mp[i].num;
				if(vis[TOT]==false)
				{
					Q.push((node){dis[TOT],TOT});
				}
			}
		}
	}
}
/*
3 3 
\/\
//\
\\\
*/
int main()
{
	int x,y;
	//cin>>n>>m>>s;
	s=1;
	scanf("%d%d",&x,&y);
	if(abs(x-y)%2==1)
	{
		printf("NO SOLUTION");
		return 0;
	}
	getchar();
	n=(x+1)*(y+1);
	m=x*y*4;
	for(register int i = 1; i <= n; ++i)dis[i] = 0x7fffffff;
	for(register int i=1;i<=x;i++)
	{
		for(register int j=1;j<=y;j++)
		{
			int a,b,c;
			char a12=getchar();
			if(a12=='\\')
			{  
				a=(i-1)*(y+1)+j;
				b=i*(y+1)+j+1;
				c=0;
				NEW(a,b,c);
				NEW(b,a,c);
				a++,b--,c=1;
				NEW(a,b,c);
				NEW(b,a,c);
			}
			if(a12=='/')
			{
				a=(i-1)*(y+1)+j+1;
				b=i*(y+1)+j;
				c=0;
				NEW(a,b,c);
				NEW(b,a,c);
				a--,b++,c++;
				NEW(a,b,c);
				NEW(b,a,c);
			}
		}
		getchar();
	}
	djstl();
	printf("%d",dis[n]);
	return 0;
}

2020/12/26 20:34
加载中...