• Fence Loops USACO 4.1(dfs找环阵亡)


    昨天头疼,眼涨,又想吐,感觉人都要死了,晚上六点实在扛不住了跑去床上睡到第二天早上七点才感觉好些了。一天啥都没干

    现在补一点,这题还是没做出来,以前dfs是遍历点,这里是要找到环,开始写发现不对,出来的不一定是环,后来看大牛的题解通过记录边的相对位置

    确实比较厉害,比如abc3条边相连,a在b里的记录方向是1,b在a的记录方向是1,c在b里的记录方向是2

    在a的记录里找到b,从b开始dfs时,dfs(b,b.dir[a]),到b这一层后只要判断 b.dir[c]!=b.dir[a]可找到c,我说的可能不太清楚,看下代码里的dfs就懂了

    /*
    
    ID: hubiao cave
    
    PROG: fence6
    
    LANG: C++
    
    */
    
    
    
    
    #include<iostream>
    
    #include<fstream>
    
    #include<cstring>
    
    using namespace std;
    
    struct fences
    {
        int f[102];
    };
    
    fences fs[102];
    
    
    int fence[102][102];
    bool used[102];
    int length[102];
    int minifence=88888;
    int nowindex;
    int n;
    int tsum=0;
    void dfs(int,int);
    int main()
    
    {
        ifstream fin("fence6.in");
        ofstream fout("fence6.out");
        fin>>n;
        for(int i=1;i<=n;i++)
        {
            int index,leftnum,rightnum;
            fin>>index;
            fin>>length[index]>>leftnum>>rightnum;
            for(int j=1;j<=leftnum;j++)
            {
                int m;
                fin>>m;
                fence[m][index]=fence[index][m]=1;
                fs[index].f[m]=1;
            }
            for(int j=1;j<=rightnum;j++)
            {
                int m;
                fin>>m;
                fence[m][index]=fence[index][m]=1;
                fs[index].f[m]=2;
            }
        }
        for(int i=1;i<=n;i++)
        {
            nowindex=i;
            dfs(i,0);
            memset(used,0,sizeof(used));
            tsum=0;
    
        }
        fout<<minifence<<endl;
        //getchar();
        return 0;
    
    
    }
    
    
    void dfs(int i,int dir)
    {
        if(tsum>=minifence)
            return;
        if(i==nowindex&&used[i])
        {
            minifence=min(tsum,minifence);
            return;
        }
        if(i==nowindex&&!used[i])
        {
            for(int j=1;j<=n;j++)
            {
                if(fs[nowindex].f[j]==1)
                {
                    used[j]=1;
                    tsum+=length[j];
                    dfs(j,fs[j].f[nowindex]);
                    used[j]=0;
                    tsum-=length[j];
                }
            }
        }
        else
        {
            for(int j=1;j<=n;j++)
            {
                if(!used[j]&&fs[i].f[j]==3-dir)
                {
                    used[j]=1;
                    tsum+=length[j];
                    dfs(j,fs[j].f[i]);
                    used[j]=0;
                    tsum-=length[j];
                }
            }
        }
    }
  • 相关阅读:
    Grails笔记二:grails 2.4.3版本下generate-*失效问题解析
    java常量池中基本数据类型包装类的小陷阱
    Mysql中使用聚合函数对null值的处理
    集合框架
    List的三个子类ArrayList,LinkedList,Vector之面试题
    String类面试题2
    String类常见面试题1
    常见对象之String类
    Scanner的概述和方法介绍
    Java开发工具(Eclipse工作空间的基本配置)
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3399368.html
Copyright © 2020-2023  润新知