dijkstra求助qwq
查看原帖
dijkstra求助qwq
219866
Blunt_Feeling楼主2020/7/24 15:57

rt,我用 SPFA 得了 80 分,提交记录

//SPFA
#include<bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
using namespace std;
const int maxn=50050,maxe=100050,maxp=13;
struct Edge{
	int v,w,nxt;
	Edge() {};
	Edge(int _v,int _w,int _nxt) {
		v=_v; w=_w; nxt=_nxt;
	}
}edge[maxe<<1];
int n,p,m,ecnt,rel[maxp],head[maxn];
queue<int> que;
void init()
{
	ecnt=0;
	memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w)
{
	edge[ecnt]=Edge(v,w,head[u]);
	head[u]=ecnt++;
}
int dis[maxp][maxn],ans=0x3f3f3f3f;
bool inq[maxn],vis[maxp];
void spfa(int s)
{
	dis[s][rel[s]]=0;
	que.push(rel[s]);
	inq[rel[s]]=true;
	while(!que.empty())
	{
		int u=que.front();
		que.pop();
		inq[u]=false;
		for(int i=head[u];i!=-1;i=edge[i].nxt)
		{
			int v=edge[i].v,w=edge[i].w;
			if(dis[s][v]==-1||dis[s][v]>dis[s][u]+w)
			{
				dis[s][v]=dis[s][u]+w;
				if(!inq[v])
				{
					inq[v]=true;
					que.push(v);
				}
			}
		}
	}
}
void dfs(int step,int pos,int sum)
{
	if(sum>ans) return;
	if(step==p)
	{
		ans=min(ans,sum);
		return;
	}
	For(i,1,p)
	{
		if(!vis[i])
		{
			vis[i]=true;
			dfs(step+1,i,sum+dis[pos][rel[i]]);
			vis[i]=false;
		}
	}
}
int main()
{
	cin>>n>>m; p=5;
	init();
	For(i,1,p) cin>>rel[i];
	rel[p+1]=1;
	while(m--)
	{
		int u,v,t;
		cin>>u>>v>>t;
		addedge(u,v,t);
		addedge(v,u,t);
	}
	memset(dis,-1,sizeof(dis));
	For(i,1,p+1) spfa(i);
	dfs(0,p+1,0);
	cout<<ans<<endl;
	return 0;
}

但是用 dijkstra 爆零/kk。提交记录。又 WA 又 RE。

//dijkstra
#include<bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
using namespace std;
const int maxn=50050,maxe=100050,maxp=13;
struct Edge{
	int v,w,nxt;
	Edge() {};
	Edge(int _v,int _w,int _nxt) {
		v=_v; w=_w; nxt=_nxt;
	}
}edge[maxe<<1];
struct Node{
	int dis,pos;
	bool operator < (const Node &b)const{
		return dis>b.dis;
	}
	Node() {}
	Node(int _dis,int _pos) {
		dis=_dis; pos=_pos;
	}
};
priority_queue<Node> q;
int n,p,m,ecnt,rel[maxp],head[maxn];
void init()
{
	ecnt=0;
	memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w)
{
	edge[ecnt]=Edge(v,w,head[u]);
	head[u]=ecnt++;
}
int dis[maxp][maxn],ans=0x3f3f3f3f;
bool vis[maxp];
void dijkstra(int s)
{
	memset(vis,false,sizeof(vis));
	dis[s][rel[s]]=0;
	q.push(Node(dis[s][rel[s]],rel[s]));
	while(!q.empty())
	{
		int u=q.top().pos;
		q.pop();
		if(vis[u]) continue;
		vis[u]=true;
		for(int i=head[u];i!=-1;i=edge[i].nxt)
		{
			int v=edge[i].v,w=edge[i].w;
			if(dis[s][v]==-1||dis[s][v]>dis[s][u]+w)
			{
				dis[s][v]=dis[s][u]+w;
				q.push(Node(dis[s][v],v));
			}
		}
	}
}
namespace dfs
{
	bool vis[maxp];
	void dfs(int step,int pos,int sum)
	{
		if(sum>ans) return;
		if(step==p)
		{
			ans=min(ans,sum);
			return;
		}
		For(i,1,p)
		{
			if(!vis[i])
			{
				vis[i]=true;
				dfs(step+1,i,sum+dis[pos][rel[i]]);
				vis[i]=false;
			}
		}
	}
}
int main()
{
	cin>>n>>m; p=5;
	init();
	For(i,1,p) cin>>rel[i];
	rel[p+1]=1;
	while(m--)
	{
		int u,v,t;
		cin>>u>>v>>t;
		addedge(u,v,t);
		addedge(v,u,t);
	}
	memset(dis,-1,sizeof(dis));
	For(i,1,p+1) dijkstra(i);
	dfs::dfs(0,p+1,0);
	cout<<ans<<endl;
	return 0;
}

哪位大佬帮忙查一下错,十分感谢!

2020/7/24 15:57
加载中...