hdu 4337 King Arthur's Knights#DFS

来源:互联网 发布:濑户内海配乐知乎 编辑:程序博客网 时间:2024/04/28 15:44
/*n 个点的无向图上有m条边,求出一条包含这n个点的回路。n <= 150,竟然可以直接不加任何优化的DFS暴搜过去*/#include <stdio.h>#include <string.h>#include <algorithm>#include <vector>using namespace std;#define N 200vector<int> vec[N];int mat[N][N],ord[N],vis[N];int f = 0,n,m;void dfs(int rt,int t){    if(f)        return ;    ord[t] = rt;    int i;    if(t == n)    {        if(mat[rt][1])        {            f = 1;            for(i = 1; i < n; ++i)                printf("%d ",ord[i]);            printf("%d\n",ord[i]);        }        return;    }    int len = vec[rt].size();    for(i = 0; i < len; ++i)    {        if(vis[vec[rt][i]] == 0)        {            vis[vec[rt][i]] = 1;            dfs(vec[rt][i],t+1);            vis[vec[rt][i]] = 0;        }    }}int main(){    int i,j;    while(scanf("%d%d",&n,&m) == 2)    {        memset(mat,0,sizeof(mat));        memset(ord,0,sizeof(ord));        memset(vis,0,sizeof(vis));        while(m--)        {            scanf("%d%d",&i,&j);            mat[i][j] = mat[j][i] = 1;            vec[i].push_back(j);            vec[j].push_back(i);        }        f = 0;        vis[1] = 1;        dfs(1,1);        for(i = 1; i <= n; ++i)            vec[i].clear();    }    return 0;}
/*n 个点的无向图上有m条边,求出一条包含这n个点的回路。n <= 150,竟然可以直接不加任何优化的DFS暴搜过去*//*再交一次贪心的搜索的,优先搜索有较少儿子结点的儿子。结果时间也没有优化*/#include <stdio.h>#include <string.h>#include <algorithm>#include <vector>using namespace std;#define N 200struct node{    int u,cnt;    node(int a,int b)    {        u = a;        cnt = b;    }};vector<int> vec[N];vector<node> vv[N];int mat[N][N],ord[N],vis[N];int f = 0,n,m;bool cmp(node a,node b){    return a.cnt < b.cnt;}int dfs(int rt,int t){    ord[t] = rt;    int i;    if(t == n)    {        if(mat[rt][1])        {            f = 1;            for(i = 1; i < n; ++i)                printf("%d ",ord[i]);            printf("%d\n",ord[i]);            return 1;        }        return 0;    }    int len = vv[rt].size();    for(i = 0; i < len; ++i)    {        if(vis[vv[rt][i].u] == 0)        {            vis[vv[rt][i].u] = 1;            if(dfs(vv[rt][i].u,t+1))                return 1;            vis[vv[rt][i].u] = 0;        }    }    return 0;}int main(){    int i,j;    while(scanf("%d%d",&n,&m) == 2)    {        memset(mat,0,sizeof(mat));        memset(ord,0,sizeof(ord));        memset(vis,0,sizeof(vis));        while(m--)        {            scanf("%d%d",&i,&j);            mat[i][j] = mat[j][i] = 1;            vec[i].push_back(j);            vec[j].push_back(i);        }        for(i = 1; i <= n; ++i)        {            m = vec[i].size();            for(j = 0; j < m; ++j)                vv[i].push_back(node(vec[i][j],vec[vec[i][j]].size()));            sort(vv[i].begin(),vv[i].end(),cmp);        }        f = 0;        vis[1] = 1;        dfs(1,1);        for(i = 1; i <= n; ++i)            vec[i].clear(),vv[i].clear();    }    return 0;}



附hdoj的人人上正解

中等题,构造一个特殊图的Hamilton回路。首先随机得到一个环序列a1, a2, ..., an, 如果a(i)->a(i+1)在图中没有边,因为每个点至少和一半的点有边相连,于是一定可以找到另一个点j,满足a(i)-a(j)有边,a(i+1)-a(j+1)有边。然后反转环中a(i+1)到a(j)这一段序列,即可令环上存在的边数增加1或2(取决于原来的环上a(j)->a(j+1)是否有边)。继续此过程直到环上所有的边都存在。

原创粉丝点击