CCCC-GPLT L2-023. 图着色问题 图论-点染色

给定一个图,然后给出点的染色方案,问能否使得任意两个相邻点都不会有相同的颜色?
V(0 < V <= 500)、E(>= 0)和K(0 < K <= V)方案数N(<= 20)
显然遍历边列表是最优的方法,但是不妨趁势学一下链式前向星.

链式前向星是以边为核心的一种存储图的数据结构,主要部分是一个边集合数组,记录了边的两个点,下一条边的序号,和权值等信息.每个点只需记录第一条边即可.

学倒是学会了,但实在不好意思用,还是遍历边列表就好了.
注意k种颜色,是恰好为k!
还有,边的最大值为500*499/2,超过了1e5

/* LittleFall : Hello! */
#include 
#define ll long long
using namespace std;
inline int read();
inline void write(int x);
const int M = 1000016;
int point[M],color[M];
pair<int,int> line[M];
int main(void)
{
    #ifdef _LITTLEFALL_
    freopen("in.txt","r",stdin);
    #endif
    //std::cin.sync_with_stdio(false); 

    int v=read(),e=read(),k=read();
    for(int i=0;ifor(int i=1,n=read(),flag=1;i<=n;++i,flag=1)
    {
        int tush=0;
        for(int j=1;j<=v;++j) 
        {
            point[j]=read();
            if(color[point[j]]!=i)++tush;
            color[point[j]]=i;
        }
        if(tush!=k) flag=0;
        for(int j=0;jif(point[line[j].first]==point[line[j].second])
                flag=0,j=e;
        printf("%s\n",flag?"Yes":"No" );
    }
    return 0;
}


inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
inline void write(int x)
{
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}

你可能感兴趣的:(题解)