// Test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<time.h>
#include<assert.h>
#include<fstream>
#include<iomanip>
using namespace std;
time_t t1,t2;
void Tic()
{
t1=time(NULL);
// for(int i=0;i<INT_MAX;++i);
}
void Toc()
{
t2=time(NULL);
std::cout<<"time:"<<(t2-t1)/3600<<"时:"<<(t2-t1)%3600/60<<"分:"<<(t2-t1)%60<<"秒"<<std::endl;
}
#define MAX_VERTEX_NUM 26
typedef struct Color
{
int name;/*颜色名称*/
}Color;
typedef struct MGraph
{
char *vexs;
Color *vexColor;
bool **arcs;
int vexnum,arcnum;
void Print()
{
std::cout<<"--------Graph Information--------------"<<std::endl;
std::cout<<"vexnum:"<<vexnum<<",arcnum:"<<arcnum<<std::endl;
for(int i=0;i<=vexnum;++i)
{
std::cout<<std::endl;
for(int j=0;j<=vexnum;++j)
{
if(i==0&&j>0)std::cout<<setw(3)<<vexs[j];
else if(j==0&&i>0)std::cout<<setw(3)<<vexs[i];
else if(i>0&&j>0) std::cout<<setw(3)<<arcs[i][j];
else std::cout<<setw(3)<<" ";
}
}
std::cout<<std::endl<<"---------------------------------------"<<std::endl;
}
~MGraph()
{
if(vexs!=NULL)delete []vexs;
if(vexColor!=NULL)
delete []vexColor;
if(arcs!=NULL)
{
for(int i=0;i<=vexnum;++i)
delete []arcs[i];
delete []arcs;
}
}
}MGraph,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int LocateVex(MGraph&G,char vex)
{
int i=0;
for(int k=1;k<=G.vexnum;++k)
{
if(G.vexs[k]==vex)
{
i=k;
break;
}
}
return i;
}
void CreateUDG(MGraph &G,const char * fileName)
{/*建立无向图
5 8
A B C D E
A B 1
A C 1
A D 1
B C 1
B D 1
B E 1
C D 1
D E 1*/
ifstream in(fileName);
in>>G.vexnum>>G.arcnum;//读取边的数目和定点数目
G.vexs=new char[G.vexnum+1];
G.vexColor=new Color[G.vexnum+1];
G.arcs=new bool*[G.vexnum+1];
for(int i=0;i<=G.vexnum;++i)
G.arcs[i]=new bool[G.vexnum+1];
for(int i=0;i<=G.vexnum;++i)
{
G.vexs[i]=' ';
G.vexColor[i].name=0;
for(int j=0;j<=G.vexnum;++j)
G.arcs[i][j]=false;
}
for(int i=1;i<=G.vexnum;++i)
in>>G.vexs[i];
int line=1;
while(line<=G.arcnum)
{
int i,j,k;
char v1,v2;
in>>v1>>v2>>k;// A B 1 表示顶点A 和B 之间有边
i=LocateVex(G,v1);
j=LocateVex(G,v2);
assert(i>0&&i<=G.vexnum&&j>=0&&j<=G.vexnum);//图的顶点序号从1 开始
G.arcs[i][j]=k==1?true:false;
G.arcs[j][i]=G.arcs[i][j];
line++;
}
in.clear();
in.close();
}
bool IsOk(MGraph&G,int curVex,Color color)
{//当前顶点curVex涂颜色color是否可以
for(int i=1;i<=G.vexnum;++i)
{
if(G.arcs[curVex][i])
{
if(G.vexColor[i].name==color.name)//简化处理直接比较颜色名称
return false;
}
}
return true;
}
int result=0;
void MColoring(MGraph &G,int curVex,Color *const &colors,const int colorNum,bool *&isUse)
{ /* 对图G的第curVex个顶点 考虑其着色方案*/
if(curVex>G.vexnum)
{
result++;
std::cout<<"----------result-----------------"<<std::endl;
for(int i=1;i<=G.vexnum;++i)
std::cout<<"vex:"<<G.vexs[i]<<",color:"<<G.vexColor[i].name<<std::endl;
std::cout<<"----------------------------------"<<std::endl;
}
else
{
for(int i=0;i<colorNum;++i)
{
if(!isUse[i]&&IsOk(G,curVex,colors[i]))
{
G.vexColor[curVex].name=colors[i].name;
isUse[i]=true;
MColoring(G,curVex+1,colors,colorNum,isUse);
G.vexColor[curVex].name=0;
isUse[i]=false;
}
}
}
}
void Init(int m,bool*&isUse,Color *&colors)
{
isUse=new bool[m];
colors=new Color[m];
for(int i=0;i<m;++i)
{
isUse[i]=false;
colors[i].name=i+1;
}
}
void RunAlgorithm()
{
MGraph G;
CreateUDG(G,"Graph.txt");
G.Print();
bool *isUse;
Color *colors;
int colorNum=4;
while(cin>>colorNum)
{
if(colorNum==0)break;
Init(colorNum,isUse,colors);
result=0;//全局变量记录 解个数
Tic();
MColoring(G,1,colors,colorNum,isUse);
Toc();
std::cout<<"Number of result:"<<result<<std::endl;
delete []isUse;
delete []colors;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
RunAlgorithm();
system("pause");
return 0;
}