gym 101492 A. Comunicating the Tibet(dfs遍历无向图)

来源:互联网 发布:身份证给别人开淘宝店 编辑:程序博客网 时间:2024/05/16 14:36

题意:

输入n,m,k;分别代表n个节点,m条边,每个节点的取值范围(1~k的正整数)。让你给每个节点赋值,使得每个节点和相连的节点的值不相同。

思路:

一个一个节点赋值,暴力枚举赋值,赋值时考虑周围的节点有没有冲突。。。。但是不能1~n的取节点赋值,,只能从节点1开始dfs遍历图赋值(即每赋值一个节点,必须马上考虑该节点周围的值,才能保证得到最优策略)

给出一组数据

4 3 2

1 3                                 对应到图  1----3----4-----2

3 4

4 2

如果枚举1~n赋值,输出-1;

如果dfs遍历赋值,

输出

1

2

2

1

代码:

#include <bits/stdc++.h>using namespace std;const int maxn = 50000+7;vector<int> arr[maxn];int col[maxn];int n,m,k;void dfs(int u){    if(col[u])        return ;    int len = arr[u].size();    for(int i = 1;i<=k*2;i++)    {        int j;        for(j = 0;j<len;j++)        {            int v = arr[u][j];            if(col[v]==i)                break;        }        if(j==len)        {            col[u] = i;            break;        }    }    for(int i = 0;i<len;i++)    {        int v = arr[u][i];        dfs(v);    }}int main(){    memset(col,0,sizeof(col));    scanf("%d%d%d",&n,&m,&k);    for(int i = 0;i<m;i++)    {        int u,v;        scanf("%d%d",&u,&v);        arr[u].push_back(v);        arr[v].push_back(u);    }    for(int i = 1;i<=n;i++)        if(!col[i])            dfs(i);    for(int i = 1;i<=n;i++)        if(col[i]>k)        {            printf("-1\n");            return 0;        }    for(int i = 1;i<=n;i++)        printf("%d\n",col[i]);    return 0;}

原创粉丝点击