In mathematics you don't understand things, you just get used to them.

link。

首先可以发现,如 $\exists (u, v) \in \mathbf E$,则 $a_u \not \equiv a_v \pmod 2$,那么如果图中存在奇环,则不可能存在解(奇 - 偶 - 奇 矛盾)。那么这就是一个二分图,考虑如何刻画题目中的条件,对于 $a_v = a_u+1$ 型的条件,可以直接用差分约束的方式刻画,即 $a_v \geqslant a_u+1$ 且 $a_v \leqslant a_u+1$;再看到 $\mid a_u - a_v \mid = 1$,则拆成 $-1 \leqslant a_u - a_v \leqslant 1$ 且 $a_u \neq a_v$。

因为奇偶性不同,所以 $a_u \neq a_v$ 一定成立,直接用 Floyd-Warshall 算法跑全源最短路即可。最大极差的限制即最长的两点间最短路。

int n, m, dp[1<<8][1<<8], Fa[2<<8];
int rt(int x) {
    while (x != Fa[x]) x = Fa[x] = Fa[Fa[x]];
    return x;
}
void mg(int x, int y) {
    if (rt(x) != rt(y)) Fa[rt(x)] = rt(y);
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int x, y, z;
    cin >> n >> m;
    iota(Fa, Fa+2*n, 0);
    memset(dp, 0x3f, sizeof dp);
    rep(i,n) dp[i][i] = 0;
    rep(m) {
        cin >> x >> y >> z;
        x--, y--;
        mg(x+n, y), mg(x, y+n);
        if (z) dp[x][y] = 1, dp[y][x] = -1;
        else dp[x][y] = dp[y][x] = 1;
    }
    rep(i,n) if (rt(i) == rt(i+n)) return cout<<"no\n", 0;
    rep(k,n) rep(i,n) rep(j,n) cmin(dp[i][j], dp[i][k]+dp[k][j]);
    rep(i,n) if (dp[i][i] < 0) return cout<<"no\n", 0;
    int ans = -233333333, pos = n;
    rep(i,n) {
        int MX = *max_element(dp[i], dp[i]+n);
        if (MX > ans) ans = MX, pos = i;
    }
    cout << "yes\n" << ans << "\n";
    rep(i,n) cout << dp[pos][i] << " \n"[i == n-1];
}

graph theory

「codeforces - 995F」Cowmpany Cowmpensation
Prev «
「codeforces - 1361C」Johnny and Megan's Necklace
» Next