【每日一题】7月9日题目 Color
來源:牛客網(wǎng):
時(shí)間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 131072K,其他語言262144K Special Judge, 64bit IO Format: %lld文章目錄
- 題目描述
- 題解:
- 代碼:
題目描述
給一個(gè)沒有重邊的二分圖, 要求給邊染色. 有公共點(diǎn)的邊不能同色. 問最少用多少種顏色, 并任意構(gòu)造一組方案. 輸入描述:
第一行兩個(gè)數(shù)n和m表示圖的點(diǎn)數(shù)和邊數(shù)(0<n<1001,0<m<2001). 之后m行每行2個(gè)數(shù)表示一條邊的兩個(gè)端點(diǎn). 點(diǎn)從1編號(hào)到n.
保證給的是二分圖.
輸出描述:
第一行一個(gè)數(shù)k表示需要多少種顏色. 接下來m行每行一個(gè)數(shù)表示輸入的邊的顏色. 按照輸入的順序輸出, 顏色從1編號(hào)到k.
示例1
輸入
輸出
2 1 2 2 1題解:
題目要求有公共點(diǎn)的邊不能同色,最后要求最少的顏色數(shù)
所以有公共點(diǎn)的邊我們就讓他同色
二分圖匹配:給定一個(gè)二分圖G,在G的一個(gè)子圖M中,M的邊集{E}中的任意兩條邊都不依附于同一個(gè)頂點(diǎn),則稱M是一個(gè)匹配。(也就是匹配出沒有共同點(diǎn)的邊)
邊數(shù)最大的子圖就是最大匹配
所以我們可以多次調(diào)用二分圖最大匹配(比如匈牙利算法),為每次匹配出來的邊附上色,直到全部匹配
但是有的邊可能在多次最大匹配中都可以被匹配上,怎么保證最優(yōu)呢?
根據(jù)題意,每個(gè)點(diǎn)所連的邊顏色各不相同,所以答案就是度數(shù)最大的那個(gè)點(diǎn),所以每次匹配有限從度數(shù)大的開始匹配
具體為什么從最大度下手?可以從反證法,假設(shè)從最小度開始匹配會(huì)怎么樣。也可以看看官方解釋
代碼:
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+9; int d[maxn];//點(diǎn)i的度數(shù) int x[maxn],y[maxn]; int id[maxn],col[1040][1040]; vector<int>g[maxn]; bool vis[maxn]; int match[maxn]; int n,m;bool cmp(int x,int y) {return d[x]>d[y]; } bool dfs(int u) {for(auto v:g[u]){if(!vis[v]){vis[v]=1;if(match[v]==0||dfs(match[v])){match[v]=u;match[u]=v;return 1;}}}return 0; } void init() {memset(match,0,sizeof(match));sort(id+1,id+1+n,cmp); } int main() {cin>>n>>m;int ans=0;for(int i=1;i<=m;i++){cin>>x[i]>>y[i];d[x[i]]++;d[y[i]]++;ans=max(ans,max(d[x[i]],d[y[i]]));}for(int i=1;i<=n;i++)id[i]=i;for(int i=1;i<=ans;i++){for(int j=1;j<=m;j++)if(!col[x[j]][y[j]])//該邊還未被標(biāo)記 {g[x[j]].push_back(y[j]);//存邊 g[y[j]].push_back(x[j]);}init();for(int j=1,k=id[j];j<=n;j++,k=id[j])//從度數(shù)最大的開始下手 {if(!match[k]) {memset(vis,0,sizeof(vis));dfs(k);}}for(int j=1;j<=n;j++)//對(duì)每一次最大匹配進(jìn)行染色 {if(match[j])//如果j已經(jīng)匹配 {col[j][match[j]]=i;//染上色 d[j]--;}g[j].clear();}}cout<<ans<<endl;for(int i=1;i<=m;i++)cout<<col[x[i]][y[i]]<<endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的【每日一题】7月9日题目 Color的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 江民杀毒软件效果如何? 江民杀毒软件好用
- 下一篇: 百度首页新版功能介绍