【題解】牛客OI周賽1-提高組 A.分組 dfs
阿新 • • 發佈:2018-12-13
將認識關係轉化為圖中的邊。dfs這張圖,對每一個沒有被訪問過的點,將它標記為源點的反色,回溯的時候統計每個點有多少同色相鄰點,個數等於2時將其顏色轉換。
#include<cstdio> #include<cstring> const int N=1e5+10,M=2e5+10; int n,m,tot,vis[N],hd[N]; struct Edge{ int v,nx; }e[M<<1]; void dfs(int u) { int cnt=0; for(int i=hd[u];~i;i=e[i].nx) if(!vis[e[i].v])vis[e[i].v]=vis[u]^3,dfs(e[i].v); for(int i=hd[u];~i;i=e[i].nx) cnt+=(vis[e[i].v]==vis[u]); if(cnt==2)vis[u]^=3; } void add(int u,int v) { e[tot].v=v; e[tot].nx=hd[u]; hd[u]=tot++; } int main() { //freopen("in.txt","r",stdin); memset(hd,-1,sizeof(hd)); scanf("%d%d",&n,&m); int u,v; for(int i=1;i<=m;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u); for(int i=1;i<=n;i++) if(!vis[i])vis[i]=1,dfs(i); for(int i=1;i<=n;i++) printf("%d ",vis[i]); puts(""); return 0; }
總結
初看比賽結果發現這題只有1人滿分,然後就被嚇著了。在想會不會是並查集,或者在圖中找環,後來發現這裡的認識關係不會傳遞,且節點度數不超過3,肯定會存在一種解。