zoukankan      html  css  js  c++  java
  • Hdu 4514 湫湫系列故事——设计风景线

    湫湫系列故事——设计风景线
    Time Limit: 6000/3000 MS (Java/Others)
    Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 4000
    Accepted Submission(s): 715
    Problem Description
      随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好。
      现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度。请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?
      其中,可以兴建的路线均是双向的,他们之间的长度均大于0。
    Input
      测试数据有多组,每组测试数据的第一行有两个数字n, m,其含义参见题目描述;
      接下去m行,每行3个数字u v w,分别代表这条线路的起点,终点和长度。
      [Technical Specification]
      1. n<=100000
      2. m <= 1000000
      3. 1<= u, v <= n
      4. w <= 1000
    Output
      对于每组测试数据,如果能够建成环形(并不需要连接上去全部的风景点),那么输出YES,否则输出最长的长度,每组数据输出一行。
    Sample Input
    3 3
    1 2 1
    2 3 1
    3 1 1
    Sample Output
    YES
    Source
    2013腾讯编程马拉松初赛第二场(3月22日)
    Recommend
    liuyiding

    /*
    BFS判环+BFS最长链.
    T.
    */
    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #define MAXN 100001
    #define MAXM 1000001
    using namespace std;
    int head[MAXN],n,m,tot,dfn[MAXN],x[MAXN],y[MAXN],z[MAXN],maxtot,maxt,dis[MAXN];
    bool b[MAXN];
    struct data{
        int v,next,x;
    }e[MAXM];
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void add(int u,int v,int x){
        e[++tot].v=v;
        e[tot].x=x;
        e[tot].next=head[u];
        head[u]=tot;
    }
    bool check(){
        queue<int>q;q.push(1);b[1]=true;
        while(!q.empty()){
        int u=q.front();q.pop();
            for(int i=head[u];i;i=e[i].next){
                int v=e[i].v;
                if(b[v])return true;
                else b[v]=true,q.push(v);
            }
        }
        return false;
    }
    int bfs(int u){
        memset(dis,-1,sizeof(dis));dis[u]=0;
        queue<int>q;q.push(u);
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int i=head[u];i;i=e[i].next){
                int v=e[i].v;
                if(dis[v]==-1){
                    dis[v]=dis[u]+e[i].x;q.push(v);
                    if(dis[v]>maxtot){
                        maxtot=dis[v];maxt=v;
                    }
                }
            }
        }
        return maxt;
    }
    void slove(){
        maxtot=0;
        memset(b,0,sizeof(b));
        if(check()) printf("YES
    ");
        else{
            for(int i=1;i<=m;i++)
              add(y[i],x[i],z[i]);
            int t=bfs(1);bfs(t);
            printf("%d
    ",maxtot);
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF){
            for(int i=1;i<=m;i++){
                tot=0;
                x[i]=read();y[i]=read();z[i]=read();
                add(x[i],y[i],z[i]);
            }
            slove();
        }
        return 0;
    }
    /*
    DFS判环+DFS最长链.
    */
    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    #define MAXN 100001
    #define MAXM 1000001
    using namespace std;
    int head[MAXN],n,m,tot,dfn[MAXN],maxtot,maxt,dis[MAXN],tmp[MAXN];
    struct data{
        int v,next,x;
    }e[MAXM];
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void add(int u,int v,int x){
        e[++tot].v=v;
        e[tot].x=x;
        e[tot].next=head[u];
        head[u]=tot;
    }
    bool check(int pre,int u){
        dfn[u]=true;
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].v;
            if(v==pre) continue;
            if(dfn[v]) return true;
            dis[v]=dis[u]+e[i].x;
            if(check(u,v)) return true;
        }
        return false;
    }
    void slove(){
        maxtot=0;bool flag=0;
        memset(dfn,0,sizeof(dfn));
        for(int i=1;i<=n;i++){
            if(dfn[i]) continue;
            if(check(0,i)) {
                flag=1;printf("YES
    ");break;}
            int u=max_element(dis+1,dis+1+n)-dis;  
                memcpy(tmp,dfn,sizeof(dfn)); 
                memset(dfn,false,sizeof(dfn));  
                memset(dis,0,sizeof(dis));
                check(0,u);
                maxtot=max(maxtot,*max_element(dis+1,dis+1+n));
                memcpy(dfn,tmp,sizeof(dfn));
    
        }
        if(flag) return ;
        else printf("%d
    ",maxtot);
    }
    int main()
    {
        int x,y,z;
        while(~scanf("%d%d",&n,&m)){
            tot=0;memset(head,0,sizeof(head));
            for(int i=1;i<=m;i++){
                scanf("%d%d%d",&x,&y,&z);
                //x=read();y=read();z=read();
                add(x,y,z);add(y,x,z);
            }
            slove();
        }
        return 0;
    }
  • 相关阅读:
    12-转盘
    11-UIView与核心动画对比
    10-动画组
    09-转场动画
    08-图片抖动(帧动画)
    07-心跳效果
    06-CABasicAnimation基础核心动画
    05-时钟效果
    计时器延迟 NSTimer和CADisplaylink GCD中的延迟
    ScrollView与UIPageController
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070790.html
Copyright © 2011-2022 走看看