每日一题 7月9日 Color 匈牙利算法+同点不同色的二分图的染色

题目链接:https://ac.nowcoder.com/acm/problem/14254
题目大意:
图片说明

思路:参考大佬的思路:
图片说明

#include <bits/stdc++.h>
using namespace std;

map<int, int> mp[1005];
int cloer[1005][1005];
int vis[2005];
void dfs(int x, int y, int c1, int c2){
    int to=cloer[y][c1];
    cloer[x][c1]=y, cloer[y][c1]=x;//强行把x-y染成c1。让y把c1的正确那条边染成c2
    if(!to){
        cloer[y][c2]=0;
    }
    else{
        dfs(y, to, c2, c1);
    }

}

int main(){
    int n, m, x, y; scanf("%d%d", &n, &m);
    int ans=0;
    for(int i=1; i<=m; i++){
        scanf("%d%d", &x, &y);
        mp[x][y]=mp[y][x]=i;
        int c1=1, c2=1;
        while(cloer[x][c1]){
            c1++;
        }
        while(cloer[y][c2]){
            c2++;
        }
        if(c1>c2){
            swap(x, y); swap(c1, c2);
        }
        ans=max(ans, c2);
        if(c1==c2){//如果最小没有使用的颜色一样,就直接染色
            cloer[x][c1]=y;
            cloer[y][c1]=x;
        }
        else{
            dfs(x, y, c1, c2);//否则找增广路
        }
    }
    printf("%d\n", ans);
    for(int i=1; i<=n; i++){
        for(int j=1; j<=ans; j++){
            int to=cloer[i][j];
            if(to){
                vis[mp[i][to]]=j;
            }
        }
    }
    for(int i=1; i<=m; i++){
        printf("%d\n", vis[i]);
    }

    return 0;
}
全部评论

相关推荐

我也曾抱有希望:说的好直白
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务