• hdu 4514(自己添加栈—— #pragma comment(linker, "/STACK:102400000,102400000" ))


    题意不明坑死人。。 到底是最长路呢,还是一个最小生成树?

    我只知道这个数据

    4 3
    1 2 1
    1 3 1
    1 4 3

    用最长路求出来的是4,  最小生成树求出来的是5... 最坑爹的是两种都过了。。。

    不过这次也还学到了一些东西, 就是给定的栈的大小很小,10^5的都没有, 所以这题如果要用dfs遍历树的话,要自己添加栈空间

    #pragma comment(linker, "/STACK:102400000,102400000")  //这个是好东西

    其他就比较好求了...

    最长路的代码

    #pragma comment(linker, "/STACK:102400000,102400000")
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    #define N 100100
    #define M 10001000
    
    int n,m;
    int bin[N];
    int cnt,pre[N];
    int mark[N];
    int mx;
    
    struct node
    {
        int to,next,w;
    }edge[M];
    
    void add_edge(int x,int y,int w)
    {
        edge[cnt].to=y;
        edge[cnt].w=w;
        edge[cnt].next=pre[x];
        pre[x]=cnt++;
    }
    
    int find(int x)
    {
        int s=x;
        while(bin[s]!=s) s=bin[s];
    
        while(bin[x]!=s)
        {
            int tmp=bin[x];
            bin[x]=s;
            x=tmp;
        }
        return s;
    }
    
    int dfs(int s)
    {
        int fi=0,se=0;
        mark[s]=1;
        for(int p=pre[s];p!=-1;p=edge[p].next)
        {
            int v=edge[p].to;
            if( mark[v] == 0 )
            {
                int tmp=dfs(v)+edge[p].w;
                if(tmp > fi)
                {
                    fi=tmp;
                }
                else
                {
                    if(tmp>se) se=tmp;
                }
            }
        }
        if(fi+se>mx) mx=fi+se;
        return fi;
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            cnt=0;
            mx=-1;
            memset(pre,-1,sizeof(pre));
            memset(mark,0,sizeof(mark));
            for(int i=0;i<N;i++)
                bin[i]=i;
            int flag=0;
            for(int i=0;i<m;i++)
            {
                int x,y,key;
                scanf("%d%d%d",&x,&y,&key);
                int a=0,b=1;
                a=find(x);
                b=find(y);
                bin[a]=b;
                if(a==b)
                {
                    flag=1;
                }
                add_edge(x,y,key);
                add_edge(y,x,key);
            }
            if(flag==1)
            {
                printf("YES\n");
                continue;
            }
            for(int i=1;i<=n;i++)
            {
                if(mark[i]==0)
                {
                    int tmp;
                    tmp=dfs(i);
                }
            }
            printf("%d\n",mx);
        }
        return 0;
    }
  • 相关阅读:
    VS编译cmake工程提示 “无法识别的标记”错误解决方法
    Markdown
    latex公式
    ros:time::now()详解
    c++中PROTOBUF遍历所有属性及值
    ORB-SLAM3相关博文
    WSL2安装及GUI图形界面配置踩坑指南
    ROS与PCL数据转换
    手眼标定中AX=XB求解方法及MATLAB、C++代码
    正则表达式用于数据清洗
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/2977208.html
Copyright © 2020-2023  润新知