45分求助
  • 板块P1807 最长路
  • 楼主CurryNo_1
  • 当前回复14
  • 已保存回复14
  • 发布时间2023/2/24 17:18
  • 上次更新2023/10/23 23:57:22
查看原帖
45分求助
828573
CurryNo_1楼主2023/2/24 17:18
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
int n,m,u,v,w,flag=-1,dp[2000]={},ind[2000],f[2000][2000],ans;
//f[u][v]表示从u到v的权,dp[i]代表从1到i的权的最大值 
bool mark[2000][2000]={},mark1[2000][2000]={},mark2[2000]={};
queue<int>q;
vector<int>v1[2000];
int main()
{
	cin >> n >> m;
	for(int i=1;i<=m;i++)
	{
		cin >> u >> v >> w;	
		//dp[i]储存达到i 
		if(!mark1[u][v])  
		{
		    f[u][v]=w;
		    mark1[u][v]=1;
		}
		else f[u][v]=max(f[u][v],w);
		if(!mark[u][v])
		{
		    v1[u].push_back(v);
		    mark[u][v]=1;
		    ind[v]++;
		}
	}
	q.push(1);
	while(!q.empty())
	{
		int tmp=q.front();
		if(tmp==n)  
		{
		    ans=max(ans,dp[n]);
		    flag=1;
		}
		q.pop();
		for(int i=0;i<v1[tmp].size();i++)
		{
	        int u=v1[tmp][i];
			if(!mark2[u])  
			{
			    dp[u]=f[tmp][u];
			    mark2[u]=1;
			}
			else  dp[u]=max(dp[u],dp[tmp]+f[tmp][u]);
	        ind[u]--;
	        if(!ind[u])  q.push(u);
		}
	}
	if(flag==1) cout << ans;
	else cout << flag;
}


2023/2/24 17:18
加载中...