Privatization of Roads in Treeland (贪心+染色)
思路:
- 重点是染色,不用先把贪心的点拉出来染色(这样之后不好染其他的点)
- 直接谁便一个点开始DFS染色,遇到贪心的点特判一下就OK了。
题目:SWJTU—春季集训 - Virtual Judge (vjudge.net)
#includeusing namespace std; #define ri register int #define M 400015 template <class G> void read(G &x) { x=0;int f=0;char ch=getchar(); while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} x=f?-x:x; return ; } int n,m; int head[M],to[M],nxt[M],co[M]; int cent=1; int flag[M]; void add(int a,int b) { nxt[++cent]=head[a]; to[cent]=b; head[a]=cent; } struct dian{ int in; int po; bool operator <(const dian &t)const { return in in; } }in[M]; int out[M];int vis[M]; int ans=0; void dfs(int a,int fa) { int tmp=1;vis[a]=1; for(ri p=head[a];p;p=nxt[p]) { int b=to[p]; if(vis[b]) continue; if(tmp==fa) tmp++;if(flag[a]==1) tmp=1; ans=max(ans,tmp); co[p]=tmp; co[p^1]=tmp; tmp++; dfs(b,co[p]); } } int main(){ read(n);read(m); for(ri i=1;i ) { int a,b; read(a);read(b); add(a,b); add(b,a); in[a].in++,in[b].in++; in[a].po=a;in[b].po=b; } sort(in+1,in+1+n); for(ri i=n;i>=(n-m+1);i--) { int a=in[i].po; flag[a]=1; } dfs(1,0); printf("%d\n",ans); for(ri i=2,j=1;j<=n-1;i+=2,j++) { printf("%d ",co[i]); } return 0; }