WA on #4 求调
查看原帖
WA on #4 求调
559665
chaynflow楼主2024/4/30 17:29

rt,CF 看不到数据 /fn

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n, m, cnt;
struct edge {int u, v, c, w;} e[N];
vector <int> v[N], g[N];
inline void add(int u, int v)
{
    g[u].push_back(v);
    g[v^1].push_back(u^1);
}
int tot, num[N], low[N], of[N], dfn;
stack <int> sta;
void dfs(int u)
{
    low[u] = num[u] = ++dfn;
	sta.push(u);
	for (int v : g[u])
	{
		if (!num[v]) dfs(v), low[u] = min(low[u], low[v]); 
		else if (!of[v]) low[u] = min(low[u], num[v]);
	}
	if (num[u] == low[u])
	{
		tot++;
		int v;
		do v = sta.top(), sta.pop(), of[v] = tot;
		while (v != u);
	}
}
map <int, int> mp;
bool check(int x)
{
    for (int i = 1; i <= m; i++) if (e[i].w > x) g[i<<1].push_back(i<<1^1);
	for (int i = 1; i < N; i++) num[i] = low[i] = of[i] = 0;
	tot = dfn = 0;
	for (int i = 1; i < N; i++) if (!num[i]) dfs(i);
    for (int i = 1; i <= m; i++) if (e[i].w > x) g[i<<1].pop_back();
	for (int i = 1; i <= m; i++)
		if (of[i<<1] == of[i<<1^1]) return 0;
	return 1;
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        cin >> e[i].u >> e[i].v >> e[i].c >> e[i].w;
        v[e[i].u].push_back(i); v[e[i].v].push_back(i);
    }
    cnt = m;
    for (int i = 1; i <= n; i++)
    {
        mp.clear();
        for (int j = 0; j < (int)v[i].size(); j++)
        {
            int id = v[i][j]; cnt++;
            if (!mp.count(e[id].c)) mp[e[id].c] = id;
            else if (mp[e[id].c] == -1) return cout << "No\n", 0;
            else add(id << 1 ^ 1, mp[e[id].c] << 1), mp[e[id].c] = -1;
            add(id << 1, cnt << 1); 
            if (j) add((cnt - 1) << 1, cnt << 1), add((cnt - 1) << 1, id << 1 ^ 1);
        }
    }
    int l = 1, r = 1e9, mid, ans = 2e9;
    while (l <= r)
    {
        mid = l + r >> 1;
        if (check(mid)) ans = mid, r = mid - 1;
        else l = mid + 1;
    }
    if (ans > 1e9) return cout << "No\n", 0;
    check(ans); cout << "Yes\n" << ans << " ";
    int qwq = 0;
    for (int i = 1; i <= m; i++) if (of[i<<1] < of[i<<1^1]) qwq++;
    cout << qwq << "\n";
    for (int i = 1; i <= m; i++) if (of[i<<1] < of[i<<1^1]) cout << i << " ";
	return 0;
}
2024/4/30 17:29
加载中...