• FZU 2195 思维


    很无聊的背景故事...求最短的时间原来就是省去了检查员最后上山的时间...还让不让人回家了...

    感觉这是个最短路 

    思想是求出来dis 然后求里面最大的那条边 用总长减去最长边 就是答案

    写了一个小时...dij用的还是有些不熟练 还出现了初始化dis[0]==1这种卖萌的行为

    最后千辛万苦debug结束后发现...超时了...

    我还是要放上来纪念这段思想...算法是没错的...虽然很长也很耗时间...但这是我第一次用vector写dij...还是独立...

    #define INF 1000500000
    int dis[100000];
    bool book[100000];
    struct node
    {
        int b;
        int w;
    };
    int n;
    int main(){
    while(~scanf("%d",&n))
    {
        int zong=0;
        for(int i=1;i<=n;i++)
            {
                dis[i]=INF;
    
            }
        memset(book,true,sizeof(book));
        dis[1]=0;
        book[1]=false;
        vector<node >a[n+1];
        int q,e,r;
        for(int i=1;i<=n-1;i++)
        {
            scanf("%d%d%d",&q,&e,&r);
            node t;
            t.b=e;
            t.w=r;
            a[q].push_back(t);
            t.b=q;
            a[e].push_back(t);
            zong+=r;
        }
        for(int i=1;i<=n-1;i++)
        {
            int e=a[1].size();
            int minn=INF;
            int wh=1;
            for(int k=1;k<=n;k++)
            {
                if(dis[k]<minn&&book[k]==true)
                {
                    minn=dis[k];
                    wh=k;
                }
            }
            book[wh]=false;
    
            int ee=a[wh].size();
    
            for(int k=0;k<ee;k++)
            {
    
                if(dis[a[wh][k].b]>dis[wh]+a[wh][k].w&&book[a[wh][k].b]==true)
                {
                    dis[a[wh][k].b]=dis[wh]+a[wh][k].w;
    
                }
            }
        }
        int ans=0;
        for(int i=2;i<=n;i++)
        {
            if(dis[i]>ans&&dis[i]<1000005000)
            {
                ans=dis[i];
            }
        }
        for(int i=1;i<=n;i++)
        {
            printf("%d ",dis[i]);
        }
        puts("");
    
        printf("%d
    ",zong-ans);
    }
    }
    

    然后接受了学妹神奇的思想 : x 是y的父节点。dy=dx+1

    很简单的就想到排序后直接算了

    由于排序方法是这样的 那么当我们算到3->5这条边的时候 3一定已经作为目标被行为过了 所以一开始对dis数组只需要初始化dis[1]为0即可 肯定不会出现3还没有dis值得情况

    然而还是wa了.. 有些莫名

    struct node
    {
        int a,b,w;
    };
    int dis[100050];
    int cmp(node a,node b)
    {
        if(a.a==b.a)
            return a.b<b.b;
        else return a.a<b.a;
    }
    int main(){
    int n;
    while(~scanf("%d",&n))
    {
        int zong=0;
        dis[1]=0;
        node q[n-1];
        for(int i=0;i<n-1;i++)
        {
            scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].w);
            zong+=q[i].w;
        }
        sort(q,q+n-1,cmp);
        int maxx=0;
        for(int i=0;i<n-1;i++)
        {
            dis[q[i].b]=dis[q[i].a]+q[i].w;
        }
        for(int i=1;i<=n;i++)
        {
            if(dis[i]>maxx)
                maxx=dis[i];
        }
        zong-=maxx;
        printf("%d
    ",zong);
    
    }
    }
    

    后来我就去看百度了..忽然发现了fa数组的用处..

    于是循环找父节点相加就写出来了...

    time数组代表的是当前节点的时间 因为它是一棵树所以当前节点时间唯一

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<map>
    #include<math.h>
    #include<queue>
    using namespace std;
    int fa[100050];
    int time[100050];
    int find(int x)
    {
        int sum=0;
        while(x)
        {
            sum+=time[x];
            x=fa[x];
        }
        return sum;
    }
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            int zong=0;
            memset(fa,0,sizeof(fa));
            int q,e,w;
            for(int i=1;i<=n-1;i++)
            {
                scanf("%d%d%d",&q,&e,&w);
                zong+=w;
                time[e]=w;
                fa[e]=q;
            }
            int maxx=0;
            for(int i=2;i<=n;i++)
            {
                int sum=find(i);
                if(sum>maxx)
                    maxx=sum;
            }
            zong-=maxx;
            printf("%d
    ",zong);
        }
    
    }
    

      

    将近两个小时过去了...

  • 相关阅读:
    《趣谈网络协议》(刘超老师)读后笔记记录 001
    jenkins安装配置
    Linux 磁盘分区,挂载以及格式化
    Linux三剑客之awk
    Linux三剑客之sed
    Linux-三剑客之grep
    date那些事儿
    zookeeper集群的搭建以及命令详解
    Java多线程
    mybatis获取自增主键
  • 原文地址:https://www.cnblogs.com/rayrayrainrain/p/5248486.html
Copyright © 2020-2023  润新知