#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int A[100][100];
int c[100];
int w=1,length=0;
int judice(int k,int n,int length)//判断是部分解还是完全解
{
if(length==0)//初始第一个肯定加进去 1 代表部分解 0 代表不合法 2 代表完全解
{
return 1;
}
else
{
for(int y=1;y<=length;y++)//观察之前已经表示出来的点,与这个节点有没有联系,并且相不相同
{
if(A[k][y]==1&&c[k]==c[y])//只要找到一个可以判断这个点不合法就返回0
{
return 0;
}
}
if(k==5)//在满足这个点和前几个点的值不同情况下得出完全解结束
return 2;
else
{
for(int e=k+1;e<=n;e++)//想要这个解是部分合法解,还要表示他之后还有节点与他相连
{
if(A[k][e]==1)
{
return 1;
}
}
return 0;
}
}
}
void three(int n)
{
for(int m=1;m<=n;m++)
c[m]=0;
int k=1,flag=0;
while(k>=1)
{
while(c[k]<=2)
{
c[k]=c[k]+1;
if(k==n&&judice(k,n,length)==2)
{
flag=1;
cout<<"yes";
goto loop;
}
else if(judice(k,n,length)==1)
{
length++;
k=k+1;
}
}
c[k]=0;
k=k-1;
}
loop:
if(flag==1||k==5)
{
for(int u=1;u<=n;u++)
cout<<c[u];
}
else
cout<<"no solution"<<endl;
}
int main()
{
int n,g;
cout<<"please cout n and g"<<endl;
cin>>n>>g;
for(int j=1;j<=n;j++)//建立存数的二维数组关系
{
for(int x=1;x<=n;x++)
{
A[j][x]=A[x][j]=0;
}
}
for(int i=1;i<=g;i++)//初始化连线
{
int a,b,d;
cout<<i<<"please cout a to b to 0/1"<<endl;
cin>>a>>b>>d;
A[a][b]=A[b][a]=d;
}
for(int j=1;j<=n;j++)//输出关系表
{
for(int x=1;x<=n;x++)
{
cout<<A[j][x]<<" ";
}
cout<<endl;
}
three(n);
return 0;
}