[予約] $ CF290F $説明

オリジナルを読みます

この質問\(codeforces \) \(2013 \)エイプリルフールのゲーム上の\(F \)タイトル。(また、私はそれを書いたこの問題の単語を翻訳)\ HHHH(\

タイトル検索に必要な\(N- \)ポイント\(m個\)グラフの自由縁\(ハミルトン\)パス。

しかし、それはアルゴリズムは無から作成することはできませんですが、回復必要があるので、それは、グランドフィナーレエイプリルフールのゲームになることができた理由(ペチャ\)\プログラムが書かれています。

与えられた例\(\はい) \(あるいは\) \(ノー\は)にもあります\(ペチャ\)実際には存在しないか、結果の下で実行するために書かれたプログラム\(ハミルトン\ )パス。(これはサンプルからです\(3 \)それを見ることができるはずです)

私は、あまりにも苦手少なすぎるアルゴリズムを観察することができませんので見て\(ペチャ\)アルゴリズムを、だけで
話題と人々ジェラルド(時には遅く開きます)弟はかなりいいと言って(時には遅く開く)によって書かれた、全ブログの話題のゲームをしてみましょう得るために、\(ペチャ\)アルゴリズムを。

みんなの時間を節約するために、\(ペチャ\)アルゴリズム(よく知られていますエラー貪欲法)次のように:

1)隣接リストのいずれも、(ループバック図ストレージと重い)にすべての側面を削除しません。

2)昇順(入力等しい度のソート順)に度ポイントに応じ。

3)開始点すべての可能なパスを試し、さらにアクセスポイントに現在のポイントから対応するために、当接テーブルを移動しようとします。

4)正常に見つかった場合(ハミルトン\)\のパス、出力\(\はい)、そうでなければ出力\(無\)

だから、私たちは、復元を開始することができます\(ペチャ\)アルゴリズムの問題を、合計時間の複雑さがある\()3 ^ O(N \)

ご質問がありましたら、コメント欄またはプライベートメッセージをすることができ、私はできるだけ早く返信されます。

コードは以下の通りであります:

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int ret=0,f=1;
    char ch=getchar();
    while(ch>'9'||ch<'0')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        ret=(ret<<1)+(ret<<3)+ch-'0';
        ch=getchar();
    }
    return ret*f;
}
int n,m,x,y,deg[25];
bool edge[25][25],vis[25];
int main()
{
    n=read();
    m=read();
    for(register int i=1;i<=m;i++) 
    {
        x=read();
        y=read();
        if(x==y)
            continue;
        if(edge[x][y])
            continue;
        deg[x]++;
        deg[y]++;
        edge[x][y]=1;
        edge[y][x]=1;
    }
    for(register int i=1;i<=n;i++)
    {
        int st=i,j;
        memset(vis,0,sizeof(vis));
        vis[st]=1;
        for(j=1;j<n;j++)
        {
            int minn=0,de=0;
            for(register int k=1;k<=n;k++)
            {
                if(edge[st][k]&&!vis[k])
                {
                    if(de==0||minn>deg[k])
                    {
                        de=k;
                        minn=deg[k];
                    }
                }
            }
            if(de==0)
                break;
            st=de;
            vis[st]=1;
        }
        if(j==n) 
        {
            printf("Yes\n");
            return 0;
        }
    }
    printf("No\n");
    return 0;
}

おすすめ

転載: www.cnblogs.com/Peter0701/p/11261173.html