关于这题统计路径的Dij的两种写法
查看原帖
关于这题统计路径的Dij的两种写法
224358
清平乐楼主2020/11/3 19:57

这样写会WA#6,最短路长度是对的,但统计的路径数不对

inline void Dijkstra(void)
{
	memset(d,0x3f,sizeof(d));
	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
	q.push(make_pair(d[1]=0,1));
	vis[1]=true,f[1]=1;
	while(!q.empty())
	{
		int u=q.top().second;
		q.pop();
		for(register int i=1;i<=n;++i)
			if(d[i]>d[u]+g[u][i])
			{
				f[i]=f[u];
				d[i]=d[u]+g[u][i];
				if(!vis[i]) q.push(make_pair(d[i],i));
				vis[i]=true;
			}
			else if(d[i]==d[u]+g[u][i]) f[i]+=f[u];
	}
}

这样就是对的

inline void Dijkstra(void)
{
	memset(d,0x3f,sizeof(d));
	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
	q.push(make_pair(d[1]=0,1));
	f[1]=1;
	while(!q.empty())
	{
		int u=q.top().second;
		q.pop();
		if(vis[u]) continue;
		vis[u]=true;
		for(register int i=1;i<=n;++i)
			if(d[i]>d[u]+g[u][i])
			{
				f[i]=f[u];
				d[i]=d[u]+g[u][i];
				q.push(make_pair(d[i],i));
			}
			else if(d[i]==d[u]+g[u][i]) f[i]+=f[u];
	}
}

望大佬指教

2020/11/3 19:57
加载中...