rtx978

博客园 首页 新随笔 联系 订阅 管理
#include<iostream>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
#define pr(x) cout<<"ans="<<x<<endl;
#define pp(x) cout<<x<<"\n";
#define ll long long int 
const int mod=1e9+7;
const int N=5e3+10;
int n,m;
struct node
{
	int v,w;
};
vector<node> mp[N];
int in[N];
ll dis[N];
bool vis[N];
bool spfa(int u)
{
	memset(in,0,sizeof(in));
	queue<int> q;
	for(int i=0;i<=n;i++)
	{
		dis[i]=mod;
	}
	vis[u]=1;
	dis[u]=0;
	// in[u]++;
	q.push(u);
	while(q.size())
	{
		auto now=q.front();
		// cout<<now<<endl;
		q.pop();
		vis[now]=0;
		for(auto x:mp[now])
		{
			if(dis[x.v]>dis[now]+x.w){
				dis[x.v]=dis[now]+x.w;
				if(!vis[x.v])
				{
					vis[x.v]=1;
					in[x.v]++;
					q.push(x.v);
					if(in[x.v]>n+1)
						return false;
				}
			}
		}
	}
	return true;
}
void solve()
{				//转化条件,b[i]为a[i]的前缀和
	cin>>n>>m;//差分约束问题,需要满足以下条件,同时dis【n】最小,可直接设dis[n]=0,
			// 答案为dis[n]-dis[0];
	for(int i=1;i<=n+1;i++)//dis[i]-1>=dis[i-1]  -dis[i]<=-1-dis[i-1]
	{
		mp[i].push_back({i-1,-1});
	}
	for(int i=1;i<=m;i++)
	{
		int l,r,c;
		cin>>l>>r>>c;//dis[r]-c>=dis[l-1],dis[r]<=dis[l-1]+c
		mp[l-1].push_back({r,c});
		mp[r].push_back({l-1,-c});
	}
	if(!spfa(n))
	{
		cout<<"-1"<<endl;
	}
	else
	{
		cout<<dis[n]-dis[0]<<endl;
	}
}
int main()
{
	int _=1;
	// cin>>_;
	while(_--)
	{
		solve();
	}
}
posted on 2025-05-06 01:19  1448139329  阅读(22)  评论(0)    收藏  举报