zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    该伙伴事务管理器已经禁止了它对远程/网络事务的支持
    HDU 4883 TIANKENG’s restaurant (贪心)
    Android:创建可穿戴应用
    debian支持ll命令
    mongodb进阶一之高级查询
    Hadoop之——又一次格式化hdfs系统的方法
    J2EE的13个规范之(二) JDBC 及其使用
    2015欧冠决赛--脑力劳动结硕果
    运行计划之误区,为什么COST非常小,SQL却跑得非常慢?
    QVariant与自定义数据类型转换的方法
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/2977208.html
Copyright © 2011-2022 走看看