USACO Section 4.1 Fence Loops - 简单深搜~

USACO Section 4.1 Fence Loops - 简单深搜~


就因为一个变量打错了~~~检查了一个多小时~~~囧..

这题很简单的说...数据范围很小...枚举每个点..从每个点开始DFS..回到自己了就比较一下路径长度和所记录的答案并选择较小的保存....

这题不好处理的地方就是确定点吧...我没有将点单独提出来..还是放在线段上...用0,1分别代表两端~~在DFS遍历时通过比较来确定这个点时到了那个线段的哪个端点~~


Program:

/* ID: zzyzzy12 LANG: C++ TASK: fence6 */ #include<iostream> #include<istream> #include<stdio.h> #include<string.h> #include<math.h> #include<stack> #include<algorithm> #include<queue> #define oo 2000000000 #define ll long long #define pi (atan(2)+atan(0.5))*2 using namespace std; struct node { int p,x,l; }; bool arc[105][2][105]; int len[105],n,ans,P,X; bool used[105]; void DFS(int p,int x,int l) { int i,f; for (i=1;i<=n;i++) if (arc[p][x][i]) { if (arc[i][0][p]) f=0; else f=1; if (i==P && f==X) { if (l<ans) ans=l; return; } if (!used[i]) { used[i]=true; DFS(i,1-f,l+len[i]); used[i]=false; } } return; } int main() { freopen("fence6.in","r",stdin); freopen("fence6.out","w",stdout); memset(arc,false,sizeof(arc)); int i,j,x,k,m1,m2; scanf("%d",&n); for (k=1;k<=n;k++) { scanf("%d",&x); scanf("%d%d%d",&len[x],&m1,&m2); while (m1--) { scanf("%d",&j); arc[x][0][j]=true; } while (m2--) { scanf("%d",&j); arc[x][1][j]=true; } } memset(used,false,sizeof(used)); ans=oo; for (P=1;P<=n;P++) for (X=0;X<=1;X++) { used[P]=true; DFS(P,1-X,len[P]); used[P]=false; } printf("%d\n",ans); return 0; }