hdu 5424 Rikka with Graph II 哈密顿通路

来源:互联网 发布:阿里云电子发票 编辑:程序博客网 时间:2024/05/21 21:48

Rikka with Graph II

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 367    Accepted Submission(s): 90


Problem Description
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:

Yuta has a non-direct graph with n vertices and n edges. Now he wants you to tell him if there exist a Hamiltonian path.

It is too difficult for Rikka. Can you help her?
 

Input
There are no more than 100 testcases.

For each testcase, the first line contains a number n(1n1000).

Then n lines follow. Each line contains two numbers u,v(1u,vn) , which means there is an edge between u and v.
 

Output
For each testcase, if there exist a Hamiltonian path print "YES" , otherwise print "NO".
 

Sample Input
41 11 22 32 431 22 33 1
 

Sample Output
NOYESHintFor the second testcase, One of the path is 1->2->3If you doesn't know what is Hamiltonian path, click here (https://en.wikipedia.org/wiki/Hamiltonian_path).
 

Source
BestCoder Round #53 (div.2)
 

Recommend
hujie   |   We have carefully selected several similar problems for you:  5426 5425 5422 5421 5420 
题意,给出一个n点n边的图,要求是否存在哈密顿通路。

哈密顿通路:经过每个点有且仅有一次的一条通路。

由于图,只有n个边,那么最小度的那个边,最大只有2,先判定,是否连通,如果连通,每次,都找那个度最小的作为入点,因为,最小度的点,一定会成为某条路的端点,这样就可以用o(n )的复杂度,找到一条哈密顿回路。

给个测试数据,

1 5 1 2 2 3 2 4 1 3

#define N 1005#define M 100005#define maxn 205#define MOD 1000000000000000007int n,a,b,d[N],minx,mi;vector<int> p[N];bool vis[N];void DFS(int x){    vis[x] = true;    FI(p[x].size()){        int goal = p[x][i];        if(!vis[goal]){            DFS(goal);        }    }}int main(){    //freopen("in.txt", "r", stdin);    //freopen("out.txt", "w", stdout);     while(S(n)!=EOF)    {        FI(n+1) p[i].clear();        fill(d,0);        FI(n){            S2(a,b);            if(a != b){               p[a].push_back(b);               p[b].push_back(a);               d[a]++;d[b]++;            }        }        bool isConnect = true;        fill(vis,false);        DFS(1);        For(i,1,n+1){            if(!vis[i]){                isConnect = false;                break;            }        }        if(!isConnect){            printf("NO\n");            continue;        }        minx = N;mi = 1;        For(i,1,n+1){            if(d[i] < minx){                mi = i;                minx = d[i];            }        }        fill(vis,false);        vis[mi] = true;        while(true){            bool isChange = false;            minx = N;            int mit = -1;            FI(p[mi].size()){                int goal = p[mi][i];                if(!vis[goal]){                    if(d[goal] < minx){                        mit = goal;                        minx = d[goal];                    }                    isChange = true;                }            }            if(!isChange) break;            mi = mit;            vis[mi] = true;        }        isConnect = true;        For(i,1,n+1){            if(!vis[i]){                isConnect = false;                break;            }        }        if(!isConnect)            printf("NO\n");        else            printf("YES\n");    }    //fclose(stdin);    //fclose(stdout);    return 0;}


0 0
原创粉丝点击