• 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];
                }
            }
        }
    }
  • 相关阅读:
    Kubernets 第一讲 初探
    docker 运行nginx并进入容器内部、端口映射
    Docker 国内镜像的配置及使用
    Centos7上安装docker
    富文本编辑器--FCKEditor 上传图片
    在centos7上安装elasticSearch
    Centos7上卸载openJdk安装,安装自己的JDK1.8
    fastdfs 上传图片 完整版
    nginx 启动报错 “/var/run/nginx/nginx.pid" failed” 解决方法
    nginx + fastdfs 的开机自启动
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3399368.html
Copyright © 2020-2023  润新知