1. 程式人生 > >天梯賽 L2-023. 圖著色問題

天梯賽 L2-023. 圖著色問題

blog -- flag pre back urn 註意 ios tdi

題解:用dfs遍歷圖的每條邊就好,這裏註意要求顏色的個數為k

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <map>
#include <vector>
#include <set>
using namespace std;
const int maxn=510;
int v,e,k;
vector<int> edge[maxn];
int val[maxn];
int vis[maxn];
int flag; void dfs(int now,int fa) { if(flag==1) return ; int len=edge[now].size(); for(int i=0;i<len;i++) { int next=edge[now][i]; if(val[now] == val[next]) { flag=1; return; } if(next != fa && vis[next] == 0 ) { vis[next]
=1; dfs(next,now); } } } int main() { scanf("%d %d %d",&v,&e,&k); for(int i=1;i<=e;i++) { int a,b; scanf("%d %d",&a,&b); edge[b].push_back(a); edge[a].push_back(b); } int q; cin>>q; while
(q--) { set<int> st; memset(vis,0,sizeof(vis)); flag=0; for(int i=1;i<=v;i++) { scanf("%d",&val[i]); st.insert(val[i]); } if(st.size() != k) cout<<"No"<<endl; else { for(int i=1;i<=v;i++) { if(flag==1) break; if(!vis[i]) { vis[i]=1; dfs(i,i); } } if(flag==1) cout<<"No"<<endl; else cout<<"Yes"<<endl; } } return 0; }

天梯賽 L2-023. 圖著色問題