首页 > 其他 > 详细

usaco Fence Loops(DFS)

时间:2015-09-29 09:52:51      阅读:195      评论:0      收藏:0      [点我收藏+]

在一个无向联通图里找最小环,难点是给的数据是边与边的相连情况,而不是点与点。

直接DFS从一个一条虚拟的0号边出发,在当前最新加入的边的另一端加上一个未访问过的边。数据量不大,效率还是挺好的。

这题写的时候感觉纯粹是打了好多补丁的感觉,写完后发现也挺简洁的。

总之,解决算法问题必须先考虑到所有的边界,特殊情况,然后再动手,不然很耗费时间。

USER: fan fu [modengd1]
TASK: fence6
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.008 secs, 3384 KB]
   Test 2: TEST OK [0.008 secs, 3384 KB]
   Test 3: TEST OK [0.008 secs, 3384 KB]
   Test 4: TEST OK [0.005 secs, 3384 KB]
   Test 5: TEST OK [0.008 secs, 3384 KB]
   Test 6: TEST OK [0.008 secs, 3384 KB]
   Test 7: TEST OK [0.008 secs, 3384 KB]
   Test 8: TEST OK [0.046 secs, 3384 KB]
   Test 9: TEST OK [0.019 secs, 3384 KB]

All tests OK.

Your program (‘fence6‘) produced all correct answers! This is your submission #2 for this problem.

/*
ID: modengd1
PROG: fence6
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <vector>
#include <memory.h>
using namespace std;
bool A[2][101][101];//与每条围栏一边相连的情况
int len[101];
bool vis[101];
int path[101];
int N,ans;
bool connet(int a,int b,int c)//c号边是否和a,b的交点相连
{
    return((A[0][a][c]&&A[0][b][c])||(A[1][a][c]&&A[1][b][c]));
}
void getinput()
{
    memset(A,false,sizeof(A));
    scanf("%d",&N);
    for(int i=0;i<2;i++)//任何边都和0号边相连
    {
        for(int j=1;j<=N;j++)
            A[i][j][0]=A[i][0][j]=true;
    }
    int ls,s,N1s,N2s,a,b;

    for(int i=1;i<=N;i++)
    {
        scanf("%d%d%d%d",&s,&ls,&N1s,&N2s);
        len[s]=ls;
        for(int j=0;j<N1s;j++)
        {
            scanf("%d",&a);
            A[0][s][a]=true;
        }
        for(int j=0;j<N2s;j++)
        {
            scanf("%d",&b);
            A[1][s][b]=true;
        }
    }
}
int lenvis[101];
void DFS(int lenght,int nowindex,int lastindex,int deep)
{
    if(lenght>ans)
        return;
    lenvis[nowindex]=lenght;
    path[deep]=nowindex;

    for(int i=0;i<=(deep-3);i++)//若新加进来的边和此前路劲上的某两个边的交点相连时
    {
        if(connet(path[i],path[i+1],nowindex))
            ans=min(ans,lenght-len[i]);
    }

    for(int j=1;j<=N;j++)
    {
        //选择一个未访问的且和nowindex相连,且相连的同一端未和lastindex相连的一条围栏,lastindex等于0时,忽略(同一端未和lastindex相连)这一条件
        if(((A[0][j][nowindex]&&(!A[0][j][lastindex]||lastindex==0))||(A[1][j][nowindex]&&(!A[1][j][lastindex]||lastindex==0)))&&!vis[j])
        {
            vis[j]=true;
            DFS(lenght+len[j],j,nowindex,deep+1);
            vis[j]=false;
        }
    }
}
int main()
{
    freopen("fence6.in","r",stdin);
    freopen("fence6.out","w",stdout);
    ans=0x7fffffff;
    getinput();
    vis[0]=true;
    path[0]=0;
    for(int i=1;i<=N;i++)
    {
        vis[i]=true;
        path[1]=i;
        DFS(len[i],i,0,1);
        vis[i]=false;
    }
    cout<<ans<<endl;
    return 0;
}

  

usaco Fence Loops(DFS)

原文:http://www.cnblogs.com/modengdubai/p/4845510.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!