心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
果搜即可。
从一个起点开始出发,尝试每条没有走过的边,直到不能走为止。
注意到和顶点数相比,边数要少得多,所以使用邻接表存储。
以下是我的代码:
#include<list>
#include
<cstdio>
#include
<cstring>
using namespace std;
const int kMaxn(27);


int n,m,ans;
list
<int> g[kMaxn];
bool used[kMaxn][kMaxn];

void dfs(int node,int length)
{
    
if(ans<length)
        ans
=length;
    
for(list<int>::iterator i=g[node].begin();i!=g[node].end();i++)
        
if(!used[node][*i])
        {
            used[node][
*i]=used[*i][node]=true;
            dfs(
*i,length+1);
            used[node][
*i]=used[*i][node]=false;
        }
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen(
"data.in","r",stdin);
    freopen(
"data.out","w",stdout);
    
#endif

    
while(scanf("%d%d",&n,&m)==2 && (n || m))
    {
        
for(int i=0;i<n;i++)
            g[i].clear();
        
for(int i=0;i<m;i++)
        {
            
int u,v;
            scanf(
"%d%d",&u,&v);
            g[u].push_back(v);
            g[v].push_back(u);
        }

        ans
=0;
        
for(int i=0;i<n;i++)
        {
            memset(used,
false,kMaxn*kMaxn*sizeof(bool));
            dfs(i,
0);
        }

        printf(
"%d\n",ans);
    }

    
return 0;
}
posted on 2011-04-20 10:39 lee1r 阅读(267) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:搜索

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理