zoukankan      html  css  js  c++  java
  • UVA 1613 K-Graph Oddity

    题意;

      在一个n个点的无向连通图中,n是奇数,k是使得所有点的度数不超过k的最小奇数,询问一种染色方案,使得相邻点的颜色不同。

    分析:

      k=所有点中最大的入度。如果最大入度是偶数,则k+1。每个点可选择的颜色是k-他的入度。之后进行染色。先从可选择颜色少的点进行染色,这样最后一个点一定有颜色可以染。

    代码:

      

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    using namespace std;
    int n,m;
    int k;
    int vis[10010];
    int color[10010];
    vector<int>g[10010];
    int main()
    {
    while(~scanf("%d%d",&n,&m))
    {
    int i,j;
    for(i=1;i<=n;i++)
    {
    g[i].clear();
    }
    memset(vis,0,sizeof(vis));
    memset(color,0,sizeof(color));
    int maxd=0;
    for(i=1;i<=m;i++)
    {
    int x,y;
    scanf("%d%d",&x,&y);
    vis[x]++;
    vis[y]++;
    g[x].push_back(y);
    g[y].push_back(x);
    maxd=max(max(vis[x],vis[y]),maxd);
    }
    if(maxd%2==0)
    k=maxd+1;
    else
    k=maxd;
    for(i=1;i<=n;i++)
    {
    vis[i]=k-vis[i];
    }
    for(i=1;i<=n;i++)
    {
    int p;
    int min_degree=20000;
    for(j=1;j<=n;j++)
    {
    if(color[j]==0&&min_degree>vis[j])
    {
    min_degree=vis[j];
    p=j;
    }
    }
    int map[10010];
    memset(map,0,sizeof(map));
    for(j=0;j<g[p].size();j++)
    {
    if(color[g[p][j]]!=0)
    map[color[g[p][j]]]=1;
    }
    for(j=1;j<=k;j++)
    {
    if(map[j]==0)
    {
    color[p]=j;
    break;
    }
    }
    for(j=0;j<g[p].size();j++)
    {
    if(color[g[p][j]]==0)
    {
    vis[g[p][j]]--;
    }
    }
    }
    printf("%d ",k);
    for(i=1;i<=n;i++)
    printf("%d ",color[i]);
    printf(" ");
    }
    }
  • 相关阅读:
    JAVA常见面试题之Forward和Redirect的区别
    springMVC学习笔记(二)-----注解和非注解入门小程序
    springMVC学习笔记(一)-----springMVC原理
    C语言关键字
    JAVA HASHMAP 如何用
    java中HashMap详解
    java中dao层和service层的区别是什么?
    到底DAO是什么?为什么要有它的存在?
    Ubuntu命令基础
    使用VMWare12.0安装Ubuntu系统
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4934240.html
Copyright © 2011-2022 走看看