codeforces 731C(DFS)

题目链接:http://codeforces.com/contest/731/problem/C

题意:有n只袜子(1~n),k种颜色(1~k),在m天中,左脚穿下标为l,右脚穿下标为r的袜子,问最少修改几只袜子的颜色,可以使每天穿的袜子左右两只都同颜色。

好恶心的袜子,一会儿看成改袜子的颜色,一会儿看成改l,r的颜色,一会下标看混......不过,菜是原罪=_=

思路:先建图,在每个连通分支中,把所有袜子的颜色都改成出现颜色次数最多的那个颜色,即该分支节点个数 - 最多出现次数

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int c[N];
bool vis[N];
vector <int> G[N];
map <int,int> num;
int cur,maxm;
void dfs(int x)
{
    if(vis[x])
        return;
    cur++;
    maxm = max(maxm,++num[c[x]]);
    vis[x] = 1;
    for(int i = 0; i < G[x].size(); i++)
        dfs(G[x][i]);
}
int main()
{
    int n,m,k,ans = 0;
    scanf("%d %d %d",&n,&m,&k);
    for(int i = 1; i <= n; i++)
        scanf("%d",c+i);
    for(int i = 1; i <= m; i++)
    {
        int l,r;
        scanf("%d %d",&l,&r);
        G[l].push_back(r);
        G[r].push_back(l);
    }
    for(int i = 1; i <= n; i++)
    {
        cur = maxm = 0;
        dfs(i);
        ans += cur - maxm;
        num.clear();
    }
    printf("%d\n",ans);
    return 0;
}

 


 

posted on 2016-10-17 11:44  polarday  阅读(209)  评论(0编辑  收藏  举报

导航