紫魔法师 (思维 图论 dfs)
生活随笔
收集整理的這篇文章主要介紹了
紫魔法师 (思维 图论 dfs)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:登錄—專ti業IT筆試面試備考平臺_牛客網
?
題目描述
“サーヴァント、キャスター、Medea。”--紫魔法師
給出一棵仙人掌(每條邊最多被包含于一個環,無自環,無重邊,保證連通),要求用最少的顏色對其頂點染色,滿足每條邊兩個端點的顏色不同,輸出最小顏色數即可
輸入描述:
第一行包括兩個整數n,m,表示頂點數和邊數 n <= 100000, m <= 200000 接下來m行每行兩個整數u,v,表示u,v之間有一條無向邊,保證數據合法輸出描述:
一行一個整數表示最小顏色數示例1
輸入
復制3 4 1 2 2 3 3 4 1 4
3 4 1 2 2 3 3 4 1 4輸出
復制2
2題解:
題意有點迷,大概是給你一個無向連通圖,每條邊最多參與形成一個環,現將所有節點染色,要求一條邊上的兩個節點顏色不同,問最少顏色種數。
看題解的,最開始覺得很復雜,又不是簡單樹形結構,一個點連幾個亂七八糟的環根本想不明白。但仔細一想,題頭是仙人掌,而且說了一個環不會覆蓋也不會被覆蓋其他環,那么圖肯定是長這樣的:(有點抽象)
這么模擬一下,好像最多三個,最少兩個顏色就能覆蓋全圖對吧,那么具體地,我們跑一次dfs,判斷一下1,2顏色來回染會不會沖突,沖突了就是3個,沒沖突兩個就結了。
/*keep on going and never give up*/ #include<bits/stdc++.h> using namespace std; #define int long long #define endl "\n" #define pb push_back #define fast std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); inline int read(){int tep;return scanf("%lld",&tep);} const int maxn=2e6+10; const int mod=1e9+7; int n,m,k,col[maxn]; vector<int>e[maxn]; bool dfs(int x,int cl){col[x]=cl;//cout<<x<<" "<<cl<<endl;for(auto y:e[x]){if(!col[y]) if(dfs(y,3-cl))return 1;if(col[y]==cl) return 1;}return 0; } signed main() {fast cin>>n>>m;for(int i=1;i<=m;i++){int x,y;cin>>x>>y;e[x].pb(y);e[y].pb(x);}if(m==0) { cout<<0; return 0^0;}int t=dfs(1,1); cout<<t+2;return 0^0; }?
總結
以上是生活随笔為你收集整理的紫魔法师 (思维 图论 dfs)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go开发 之 Go的 9个 基本命令
- 下一篇: WordPress获取当前TAG别名(s