78分求助
  • 板块P1807 最长路
  • 楼主李湛然
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/7/17 15:08
  • 上次更新2023/11/4 14:30:17
查看原帖
78分求助
195705
李湛然楼主2021/7/17 15:08
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <deque>
using namespace std;
const int N=1505;
int n,m;
int head[N];
int nxt[N];
int to[N];
int dist[N];
int ver[N];
bool vis[N];
int tot=0;
deque<int> q;
inline void add_edge(int x,int y,int z)
{
	nxt[++tot]=head[x];
	head[x]=tot;
	to[tot]=y;
	ver[tot]=z;
}
void spfa()
{
	int s=1;
	q.push_back(s);
	vis[s]=1;
	dist[1]=0;
	while(!q.empty())
	{
		int x=q.front();
		q.pop_front();
		for(int i=head[x];i;i=nxt[i])
		{
			int y=to[i];
			int z=ver[i];
			if(dist[y]>dist[x]+z)
			{
				dist[y]=dist[x]+z;
				if(!vis[y])
				{
					vis[y]=1;
					if(dist[y]<dist[x])
					{
						q.push_front(y);
					}
					else
					{
						q.push_back(y);
					}
				} 
			}
		}
		vis[x]=0;
	}
}
inline int read()
{
	char ch=getchar();
	int s=0,f=1;
	while(ch<'0' || ch>'9')
	{
		if(ch=='-')
		{
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		s=s*10+ch-'0';
		ch=getchar(); 
	}
	return s*f;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		dist[i]=2e9;
	}
	int u,v,w;
	for(int i=1;i<=m;i++)
	{
		u=read();
		v=read();
		w=read();
		add_edge(u,v,-w);
	} 
	spfa();
	if(-dist[n]==-2e9)
	{
		cout<<-1;
		return 0;
	}
	cout<<-dist[n];
	return 0;
}
2021/7/17 15:08
加载中...