首页 > 其他分享 >P1807 最长路

P1807 最长路

时间:2024-05-15 22:32:18浏览次数:25  
标签:ix 删点 int ll P1807 vw include 最长

链接:https://www.luogu.com.cn/problem/P1807
其实没什么难的,注意点:拓扑排序,把非1的入度为0的点及其衍生点全删了,不然会到一半无法拓扑下去。
关键在于我之前那个删点的操作,先看错误代码:

...
void clearpoint(ll ix)
{
	for (ll i = 0; i < G[ix].size(); i++)
	{
		rd[G[ix][i]]--;
		if (!rd[G[ix][i]])
			clearpoint(G[ix][i]);
	}
}
...
int main()
{
...
for (int i = 2; i <= n; i++)
		if (!rd[i])
			clearpoint(i);
...
}

这里节选的代码很明显是用深度搜索遍历删点,但是会产生问题,会多删点,比如先删了2的子节点3,顺带删除了3的子节点4,然后后面又会遍历到3节点,再删一遍4,导致本来4可以循环结果被删的无法行动,所以只能用队列来删点。
代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;
const int N = 1e3 + 500 + 10;
ll minn[N]; bool vis[N];
ll vw[N][N];
vector<ll>G[N]; ll rd[N];
int main()
{
	ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
	ll n, m; cin >> n >> m;
	for (int i = 0; i < N; i++)minn[i] = LLONG_MIN;
	for (int i = 0; i < m; i++)
	{
		ll u, v, w; cin >> u >> v >> w;
		if (!vw[u][v])
		{
			G[u].push_back(v);
			rd[v]++;
			vw[u][v] = w;
		}
		else vw[u][v] = max(vw[u][v], w);
	}
	queue<ll>qid;
	minn[1] = 0;
	qid.push(1);
//////////正确删点操作////////////
	queue<ll>q;
	for (int i = 2; i <= n; i++)
	{
		if (!rd[i]) q.push(i);
	}//初始化
	while (!q.empty())
	{
		int x = q.front();
		q.pop();
		for (int i = 0; i < G[x].size(); i++)
			if (!--rd[G[x][i]]) q.push(G[x][i]);
	}
//////////正确删点操作////////////
	while (!qid.empty())
	{
		ll now = qid.front(); qid.pop();
		for (ll i = 0; i < G[now].size(); i++)
		{
			ll wnow = vw[now][G[now][i]], nexid = G[now][i];
			vis[nexid] = 1;
			rd[nexid]--;
			minn[nexid] = max(minn[nexid], wnow + minn[now]);
			if (!rd[nexid])qid.push(nexid);
		}
	}
	if (vis[n])cout << minn[n];
	else cout << -1;
	return 0;
}

标签:ix,删点,int,ll,P1807,vw,include,最长
From: https://www.cnblogs.com/zzzsacmblog/p/18194821

相关文章

  • ABC353E字典树处理最长公共前缀
    https://atcoder.jp/contests/abc353/tasks/abc353_e其实就是字典树板子题。似乎遇到最长公共前缀,就该想到字典树。依次加入每个字符串:维护一个数组siz来统计在当前串之前的串在对应点的出现次数。手模一下字典树的建树过程,显然如果当前串\(S_i\)能跑到一个曾经串\(S_......
  • 输出最长的单词
    输入一行字符,输出最长的单词。#include<stdio.h>#include<string.h>#defineN100intLongestVoc(charstr[]);intAlpha(charc);intmain(void){charstr[N];printf("pleaseinputastring:");gets(str);intpos=LongestVoc(str);pri......
  • 【每日一题】最长回文子串
    5.最长回文子串给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"提示:1<=s.length<=1000s仅由数字和英文......
  • 图上的环和最长路
    1.有向图找环HDOJ3342LegalorNothttps://acm.hdu.edu.cn/showproblem.php?pid=3342题意:给一个\(N\)个点\(N\)条边的有向图,第\(i(1\leqM)\)条边从\(a_i\)连向\(b_i\),询问该图是否无环。\(2\leqN,M\leq100,0\leqa_i,b_i\leqN-1\)题解:建图然后......
  • leetCode 128. 最长连续序列
    给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=[0,3,7,......
  • 最长子序列
    为了解决这个问题,我们可以使用滑动窗口的方法。滑动窗口可以让我们在不需要嵌套循环的情况下遍历序列中所有的连续子序列。以下是这个方法的步骤:初始化两个指针start和end,都指向序列的开始。初始化当前和current_sum为0。移动end指针,每次移动都将end指向的值加到c......
  • 力扣1218.最长定差子序列
    题目给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于difference。​ 子序列是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从arr派生出来的序列。解题思路​ 动态规划1.常......
  • 2024-05-04:用go语言,给定一个起始索引为0的字符串s和一个整数k。 要进行分割操作,直到字
    2024-05-04:用go语言,给定一个起始索引为0的字符串s和一个整数k。要进行分割操作,直到字符串s为空:选择s的最长前缀,该前缀最多包含k个不同字符;删除该前缀,递增分割计数。如果有剩余字符,它们保持原来的顺序。在操作之前,可以修改字符串s中的一个字符为另一个小写英文字母。在最佳情......
  • leetcode算法热题--最长连续序列
    题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=......
  • leetcode算法热题--最长连续序列
    题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=......