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];
            }
        }
    }
}
原文地址:https://www.cnblogs.com/cavehubiao/p/3399368.html