染色法判断是否为(k)染色图,需要一个(vis)数组防止走环路。
const int N=10010;
vector<int> g[N];
bool vis[N];
int color[N];
int n,m,q;
bool dfs(int u)
{
vis[u]=true;
for(int i=0;i<g[u].size();i++)
{
int j=g[u][i];
if(color[j] == color[u]) return false;
else if(!vis[j])
{
if(!dfs[j]) return false;
}
}
return true;
}
int main()
{
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
g[a].pb(b);
g[b].pb(a);
}
cin>>q;
while(q--)
{
memset(vis,0,sizeof vis);
set<int> S;
for(int i=0;i<n;i++)
{
cin>>color[i];
S.insert(color[i]);
}
bool ok=true;
for(int i=0;i<n;i++)
if(!vis[i])
{
if(!dfs(i))
{
ok=false;
break;
}
}
if(ok)
cout<<S.size()<<"-coloring"<<endl;
else
puts("No");
}
//system("pause");
return 0;
}
也可直接枚举每条边。
const int N=10010;
PII e[N];
int color[N];
int n,m,q;
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
cin>>e[i].fi>>e[i].se;
cin>>q;
while(q--)
{
unordered_set<int> S;
for(int i=0;i<n;i++)
{
cin>>color[i];
S.insert(color[i]);
}
bool ok=true;
for(int i=0;i<m;i++)
{
int a=e[i].fi,b=e[i].se;
if(color[a] == color[b])
{
ok=false;
break;
}
}
if(ok) cout<<S.size()<<"-coloring"<<endl;
else puts("No");
}
//system("pause");
return 0;
}