首页 > 其他分享 >最长路

最长路

时间:2022-11-15 21:45:06浏览次数:60  
标签:const int wi tot now 最长 dis

P1807 最长路

dfs

#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1505;
const int M=5e4+5;

int h[N],ne[M],e[M],w[M],tot;
void add(int from,int to,int wi) {
    e[++tot]=to;
    ne[tot]=h[from];
    w[tot]=wi;
    h[from]=tot;
}

int n,m;
int dis[N];
int dfs(int now) {
    if(dis[now]!=-inf)return dis[now];
    if(now==n)return dis[now]=0;
    for(int i=h[now];i;i=ne[i]) {
        int to=e[i];
        if(dfs(to)!=-inf)
            dis[now]=max(dis[now],dfs(to)+w[i]);
    }
    return dis[now];
}

int main() {
    cin>>n>>m;
    for(int i=1;i<=n;i++)dis[i]=-inf;
    while(m--) {
        int x,y,wi;
        cin>>x>>y>>wi;
        add(x,y,wi);
    }
    int ans=dfs(1);
    if(ans==-inf)cout<<-1<<endl;
    else cout<<ans<<endl;
    return 0;
}

拓扑排序

#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1505;
const int M=5e4+5;

int h[N],ne[M],e[M],w[M],tot;
void add(int from,int to,int wi) {
    e[++tot]=to;
    ne[tot]=h[from];
    w[tot]=wi;
    h[from]=tot;
}

int n,m;
int dis[N],in[N];
void topsort() {
    queue<int>q;
    for(int i=1;i<=n;i++)dis[i]=-inf;
    for(int i=1;i<=n;i++)
        if(in[i]==0)q.push(i);
    dis[1]=0;
    while(!q.empty()) {
        int now=q.front();
        q.pop();
        for(int i=h[now];i;i=ne[i]) {
            int to=e[i];
            dis[to]=max(dis[to],dis[now]+w[i]);
            if(--in[to]==0)q.push(to);
        }
    }
    if(dis[n]<=-1e7)cout<<-1<<endl;
    else cout<<dis[n]<<endl;
}

int main() {
    cin>>n>>m;
    while(m--) {
        int x,y,wi;
        cin>>x>>y>>wi;
        add(x,y,wi);
        in[y]++;
    }
    topsort();
    return 0;
}

SPFA

这个算法可以卡掉的,至于能不能用,全看出题人。总之尽量用上面两种

#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1505;
const int M=5e4+5;

int h[N],ne[M],e[M],w[M],tot;
void add(int from,int to,int wi) {
    e[++tot]=to;
    ne[tot]=h[from];
    w[tot]=wi;
    h[from]=tot;
}

//spfa是可以卡掉的
int n,m;
int dis[N];
bool vis[N];
void spfa() {
    queue<int>q;
    for(int i=1;i<=n;i++)dis[i]=-inf;
    dis[1]=0;
    vis[1]=1;
    q.push(1);
    while(!q.empty()) {
        int now=q.front();
        vis[now]=0;
        q.pop();
        for(int i=h[now];i;i=ne[i]) {
            int to=e[i];
            if(dis[to]<dis[now]+w[i]) {
                dis[to]=dis[now]+w[i];
                if(vis[to]==0)q.push(to),vis[to]=1;
            }
        }
    }
    if(dis[n]<=-1e7)cout<<-1<<endl;//这里需要特别判断一下,不能是直接!=inf
    else cout<<dis[n]<<endl;
}

int main() {
    cin>>n>>m;
    while(m--) {
        int x,y,wi;
        cin>>x>>y>>wi;
        add(x,y,wi);
    }
    spfa();
    return 0;
}

标签:const,int,wi,tot,now,最长,dis
From: https://www.cnblogs.com/basicecho/p/16894088.html

相关文章

  • 数据结构之动态规划 斐波那契数列&最长公共子序列
    $fib()$递归$fib(n)=fib(n-1)+fib(n-2):{0,1,1,2,3,5,8,……}$复杂度计算$T(0)=T(1)=1;T(n)=T(n-1)+T(n-2)+1,n>1$令$S(n)=\frac{[T(n)+1]}{2}$//这是要去掉......
  • C++中sort函数、1.4最长公共子串
    sort()即为用来排序的函数,它根据具体情况使用不同的排序方法,效率较高。sort在实现时避免了经典快速排序中可能出现的会导致实际复杂度退化到O(n2)的极端情况。使用sort()......
  • leetcode 3. 无重复字符的最长子串
    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度......
  • leetcode 5. 最长回文子串
    给你一个字符串 s,找到 s 中最长的回文子串。 示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb" 提示:1<......
  • 最长无重复子数组
    最长无重复子数组 import java.util.*;public class Solution {    /**     *      * @param arr int整型一维数组 the array    ......
  • 2022NOIP A层联测26 乘筛积 放进去 最长路径 生成树的传说
    T1[转化枚举角度]给出长度是n的a序列,和长度是m的b序列,给出Q组询问\([p,q]\),求\(\sum_{p*i+q*j=C}^{}ai*bj\)。(n,m,C,q<=3e5)考场上来想枚举,对于\(max(p,q)>=\sqrt{C}\),......
  • 最长公共子串
    最长公共子序列和最长公共子串区别最长公共子串(LongestCommonSubstring)与最长公共子序列(LongestCommonSubsequence)的区别:子串要求在原字符串中是连续的,而子序列则只......
  • 查找字符串数组中的最长公共前缀
     import java.util.*;public class Solution {    /**     *      * @param strs string字符串一维数组      * @return string......
  • LIS 最长递增子序列 三种求解方式
    1dp2二分3indextree 题目描述给出一个列表如[[6,7,],[5,4],[3,2]],表示木块的长和宽,当木块的长和宽不大于另个木块的长和宽时,就可以放在上面,此外数组还可以左右翻......
  • 128.最长连续序列
    给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。示例1:输入:nums......