91分拓朴排序测试点2求助
  • 板块P1807 最长路
  • 楼主evencc
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/26 12:47
  • 上次更新2023/12/26 16:58:26
查看原帖
91分拓朴排序测试点2求助
252361
evencc楼主2023/12/26 12:47

91分,使用的是拓朴排序的方法,未通过测试点2

#include<bits/stdc++.h>
using namespace std;

struct AMGraph
{
	vector<vector<long long>>arcs;//边
	vector<vector<long long>>arcsNum;//权值
	long long vexnum, arcnum;
};

vector<long long>ind;//入度
vector<long long>lineNum;//1到此点的最大权值
queue<long long>vexBag;//队列
long long ans=0;

int main()
{
	AMGraph	G;
	cin>>G.vexnum>>G.arcnum;
	G.arcs.resize(G.vexnum+1);
	ind.resize(G.vexnum+1, 0);
	G.arcsNum.resize(G.vexnum+1);
	lineNum.resize(G.vexnum+1);
	for(long long i=1;i<=G.arcnum;i++)
	{
		long long temp1, temp2;
		cin>>temp1>>temp2;
		G.arcs[temp1].push_back(temp2);
		ind[temp2]++;
		
		long long temp3;
		cin>>temp3;
		G.arcsNum[temp1].push_back(temp3);
	}

	for(long long i=2;i<=G.vexnum;i++)
	{
		if(ind[i]==0)
		{
			vexBag.push(i);
		}
	}
	while(!vexBag.empty())
	{
		long long temp=vexBag.front();
		vexBag.pop();

		for(int i:G.arcs[temp])
		{
			ind[i]--;
			if(ind[i]==0)vexBag.push(i);
		}
	}

	vexBag.push(1);
	while(!vexBag.empty())
	{
		long long temp=vexBag.front();
		vexBag.pop();

		for(int i=0;i<G.arcs[temp].size();i++)
		{
			ind[G.arcs[temp][i]]--;
			if(ind[G.arcs[temp][i]]==0)vexBag.push(G.arcs[temp][i]);
			lineNum[G.arcs[temp][i]]=max(lineNum[temp]+G.arcsNum[temp][i],lineNum[G.arcs[temp][i]]);
		}
	}
	if(lineNum[G.vexnum]==0)cout<<"-1";
	else cout<<lineNum[G.vexnum];
	return 0;
}
2023/12/26 12:47
加载中...