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]; } } } }