求助spfa和dijkstra跑分层图的问题
查看原帖
求助spfa和dijkstra跑分层图的问题
299810
issue_is_fw楼主2020/8/16 20:42

代码的思路是分层图,分成三层写

其实这都不重要

第一层图和第二层图是负边权,第二层图和第三层是正边权,求最长路

每层图内部边权都是0

主要是函数用spfa过了,用dijkstra错了,我感觉差不多啊

求dalao看看代码中的dijstra和spfa有啥区别呜呜

#include <bits/stdc++.h>
using namespace std;
const int maxn=4e6+10;
int n,m,s,t,k;
int dis[maxn],vis[maxn],a[maxn];
struct edge{
	int to,w,nxt;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v,int w){
	d[cnt]=(edge){ v,w,head[u] },head[u]=cnt++;
}
typedef pair<int,int>p;
priority_queue<p,vector<p> >q;
void dijkstra(int s)
{
	for(int i=0;i<=3*n;i++)	dis[i]=-1e9;
	memset( vis,0,sizeof(vis) );
	dis[s]=0,q.push( p(0,s) );
	while( !q.empty() )
	{
		int now=q.top().second; q.pop();
		if( vis[now] )	continue;
		vis[now]=1;
		for(int i=head[now];i;i=d[i].nxt )
		{
			int v=d[i].to;
			if( dis[v]<dis[now]+d[i].w )
			{
				dis[v]=dis[now]+d[i].w;
				if( !vis[v] )	q.push( p(dis[v],v) );
			}
		}
	}
}
void spfa(int s)
{
	queue<int>q;
	for(int i=0;i<=3*n;i++)	dis[i]=-1e9;
	dis[s]=0,q.push(s);
	while( !q.empty() )
	{
		int now=q.front(); q.pop();
		vis[now]=0;
		for(int i=head[now];i;i=d[i].nxt)
		{
			int v=d[i].to;
			if( dis[v]<dis[now]+d[i].w )
			{
				dis[v]=dis[now]+d[i].w;
				if( !vis[v] )	vis[v]=1,q.push(v);
			}
		}
	}
}
int main()
{
	cin >> n >> m ;
	for(int i=1;i<=n;i++)	cin >> a[i];
	for(int i=1;i<=m;i++)
	{
		int l,r,ok;
		cin >> l >> r >> ok;
		add(l,r,0); add(l+n,r+n,0); add(l+2*n,r+2*n,0);
		add(l,r+n,-a[l]);
		add(l+n,r+2*n,a[l] );
		if( ok==2 )
		{
	    	add(r,l,0); add(r+n,l+n,0); add(r+2*n,l+2*n,0);
			add(r,l+n,-a[r] );
			add(r+n,l+2*n,a[r] );
		}
	}
	//dijkstra(1);
	spfa(1);
	cout << max(0,dis[3*n] );
}
2020/8/16 20:42
加载中...