USACO Section 4.1 Fence Loops - 简单深搜~_#include

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

     这题很简单的说...数据范围很小...枚举每个点..从每个点开始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;
}