uva 539 The Settlers of Catan

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n,m;
int G[30][30];
int max_,max_p,cnt;

void dfs(int u)
{
    for(int v=0;v<n;v++)
    {
        if(G[u][v])
        {
            cnt++;
            G[u][v]--;
            G[v][u]--;
            if(cnt>max_p)
                max_p=cnt;
            dfs(v);
            G[u][v]++;
            G[v][u]++;
        }
    }
    cnt--;
    return;
}

void solve()
{
    max_=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(G[i][j])
            {
                max_p=0;
                cnt=0;
                dfs(i);
                if(max_p>max_)
                    max_=max_p;
            }
        }
    }
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0&&m==0)
            break;
        memset(G,0,sizeof(G));
        int a, b;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            G[a][b]++;
            G[b][a]++;
        }

        solve();

        printf("%d\n",max_);
    }
    return 0;
}

这不就是无向图的遍历么……走不通就往回退。小小的区别在于,因为需要计数走了几个,所以用到了一点点回溯的思想~往回退的时候将cnt - -。

哦还有因为进行多次遍历的时候,都需要用到G[][]数组,所以这个地方也应用了回溯的思想将其复原~

回溯中的走不通往回退,在这里其实没有明确体现出来。

因为数据量并不算大,而且我们也并不清楚从那个点开始遍历能得到最大的cnt,所以我们就可以把每个都当做起点都遍历一遍~找出其中最大的max_记录下来就好了。

你可能感兴趣的:(枚举,遍历,DFS,回溯)