46分拓扑求调
查看原帖
46分拓扑求调
672534
Field_Mouse楼主2023/12/23 10:20
#include<bits/stdc++.h>
#define AC return 0;
#define sc(n) scanf("%d",&(n))
#define pr(n) printf("%lld",(n))
#define hh puts("")
#define int long long 
#define kg printf(" ")
using namespace std;
namespace fr{
	int read()
	{
		int x=0,flag=1;
		char ch=getchar();
		for(;ch>'9'||ch<'0';ch=getchar())if(ch=='-')flag=-1;
		for(;ch<='9'&&ch>='0';ch=getchar())x=(x<<3)+(x<<1)+ch-'0';
		return flag*x;
	}
}
using namespace fr;
struct node{int v,w;};
const int N =1e4+5;
vector<node>g[N];
int in[N];
int ans;
int dis[N];
signed main()
{
	int n=read(),m=read();
	for(int i=1;i<=m;i++)
	{
		int u=read(),v=read(),w=read();
		g[u].push_back({v,w});
		in[v]++;
	}
	queue<int> q;
	for(int i=2;i<=n;i++)
	{
		dis[i]= -1e9;
		if(in[i]==0)
			q.push(i);
	}
	while(q.size()){
		int p=q.front();
		q.pop();
		for(auto i:g[p])
		{
			if(!--in[i.v])q.push(i.v);
		}
	}
	q.push(1);
	while(q.size()){
		int now=q.front();
		q.pop();
		for(auto i:g[now])
		{
			if(dis[i.v]<dis[now]+i.w)
			{
				dis[i.v]=dis[now]+i.w;
				if(!--in[i.v])q.push(i.v);
			}
		}
	}
	if(dis[n]==-1e9)puts("-1");
	else
	pr(dis[n]);
	AC
}

这是记录

2023/12/23 10:20
加载中...