m着色问题JAVA_JAVA图的m着色问题

这是一个关于无向连通图的m着色问题,给定节点数n,边数m和颜色数k,目标是找出是否存在一种着色方式使得每条边的两个顶点颜色不同。程序通过读取输入的边信息,使用回溯法进行颜色尝试分配,如果满足条件则输出所有可能的着色方案。
摘要由CSDN通过智能技术生成

题目:

题目描述

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色,请输出着色方案。

输入

输入第一行包含n,m,k分别代表n个结点,m条边,k种颜色,接下来m行每行有2个数u,v表示u和v之间有一条无向边,可能出现自环边,所以请忽略自环边。

输出

输出所有不同的着色方案,且按照字典序从小到大输出方案。

样例输入 Copy

3 3 3

1 2

1 3

2 3

样例输出 Copy

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

package book;

import java.util.Scanner;

/*

* 总结:图的m色问题

* 给第t个点着色,要判断与该点有边的点着色的颜色是否一样

* 对于第t个点,做一个循环,m种颜色每种都要试试,不符合条件就剪掉

*/

public class pic {

static int x,y,z;

static int grh[][];

static int colors[];

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);

x=sc.nextInt();//节点数

y=sc.nextInt();//边数

z=sc.nextInt();//颜色数

grh=new int[x+1][x+1];

colors=new int[x+1];//每个点着色

for(int i=1;i<=x;i++) {

colors[i]=0;

}

for(int i=1;i<=y;i++) {

int start=sc.nextInt();

int end=sc.nextInt();

if(start!=end) {

grh[start][end]=1;

grh[end][start]=1;

}

}//初始化地图

backtrace(1,z);

}

private static void backtrace(int t, int m) {

if(t>x) {

for(int h=1;h<=x;h++) {

System.out.print(colors[h]+" ");

}

System.out.println();

}else {

for(int i=1;i<=m;i++) {

if(check(t,i)==1) {

colors[t]=i;

backtrace(t+1,m);

}

}

}

}

private static int check(int t, int i) {

for(int k=1;k

if(grh[t][k]==1&&colors[k]==i) {

return 0;

}

}

return 1;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值