题意:
给与一个二分图,给边染色,连接同一端点的边的颜色不能相同,求最少用多少种颜色才能完成染色?

思路:
二分图最大匹配的匈牙利算法,对一条边进行染色,设一个端点最小可染的颜色为x,另一个端点最小可染的颜色为x.
①x==y,该边染成x.
②x<y,将该边强行染成x,最小可染颜色为y的点显然已经有了一条为x的边,所以将原先为x的边强行染为y,然后原先为x的边指向的点只好将原先为y的边再强行染成x(如果该点y颜色没有用,则该为边改为y,x颜色标识没用,条件可行),不断进行下去,直到可行为止。

代码:

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

typedef long long ll;

map<int,int> ma;
int bian[1005][2005];
int color[2005];

void dfs(int u, int v,int x,int y)
{
    int xia=bian[v][x];
    bian[u][x]=v;
    bian[v][x]=u;
    if(xia==0)
    {
        bian[v][y]=0;
    }
    else
    {
        dfs(v,xia,y,x);
    }
}

int main()
{
    int n, m, zui=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u, v, x=1, y=1;
        scanf("%d%d",&u,&v);
        ma[u*10000+v]=i;
        ma[v*10000+u]=i;
        while(bian[u][x])
        {
            x++;
        }
        while(bian[v][y])
        {
            y++;
        }
        if(x>y)
        {
            swap(u,v);
            swap(x,y);
        }
        zui=max(zui,y);
        if(x==y)
        {
            bian[u][x]=v;
            bian[v][y]=u;
        }
        else
        {
            dfs(u,v,x,y);
        }
    }
    printf("%d\n",zui);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=zui;j++)
        {
            if(bian[i][j])
            {
                int k=i*10000+bian[i][j];
                color[ma[k]]=j;
            }
        }
    }
    for(int i=1;i<=m;i++)
    {
        printf("%d\n",color[i]);
    }
    return 0;
}