其他分享
首页 > 其他分享> > The Number of Imposters 图染色(1700)

The Number of Imposters 图染色(1700)

作者:互联网

在这里插入图片描述
题意 :

思路 :

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#define endl '\n'
#define pb push_back
 
using namespace std;
 
typedef long long ll;

const int N = 7e5 + 10;

int n, m;
vector<int> ve[N];
int t[2];       // t[0/1]记录连通块内染0/1的数量
bool ok;        // ok记录是否有矛盾情况
int col[N];     // col记录染色情况

void dfs(int now)
{
    for (auto it : ve[now])
    {
        if (col[it] == col[now])
        {
            ok = false;
            return ;
        }
        if (col[it] != -1) continue;
        
        col[it] = 1 - col[now];
        if (it <= n) t[col[it]] ++ ;       // 不是fake node就统计所属颜色个数
        dfs(it);        // 继续遍历当前连通块
    }
}

void solve()
{
    cin >> n >> m;
    
    ok = true;
    for (int i = 1; i <= n + m; i ++ ) col[i] = -1, ve[i].clear(); // 染色,初始设为-1
    
    int cnt = n;
    while (m -- )
    {
        int x, y; string s;
        cin >> x >> y >> s;
        
        if (s[0] == 'i')
        {
            ve[x].pb(y);
            ve[y].pb(x);
        }
        else
        {
            ve[x].pb( ++ cnt);
            ve[cnt].pb(x);
            ve[y].pb(cnt);
            ve[cnt].pb(y);
        }
    }
    
    int ans = 0;
    for (int i = 1; i <= n; i ++ )
    {
        if (col[i] != -1) continue;
        col[i] = 0;
        t[0] = 1, t[1] = 0;

        // 对一个连通块进行染色
        dfs(i);

        ans += max(t[0], t[1]);
    }
    
    if (!ok) ans = -1;
    cout << ans << endl;
}
 
int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    
    int _ = 1;
    cin >> _;
    
    while (_ -- )
    {
        solve();
    }
    
    return 0;
}

标签:1700,连通,ok,ve,int,Number,pb,Imposters,col
来源: https://blog.csdn.net/m0_51448653/article/details/121450157