1. 程式人生 > >Codeforces 841 D - Leha and another game about graph

Codeforces 841 D - Leha and another game about graph

ora second 一個 unsigned txt code cto efi sizeof

D - Leha and another game about graph

思路:首先,如果所有點的度數加起來是奇數,且沒有-1,那麽是不可以的。

其他情況都可以構造,我們先dfs出一個生成樹,然後從葉子節點開始往上處理

對於節點u和v,邊u -> v,如果d[v]等於1,那麽就要選這條邊,d[u]取反(改變狀態)

這樣的話v就可以不用管了,一直這樣下去直到根節點,出了根節點,其他點都能滿足

如果存在-1,就把-1放在根節點,如果沒有的話,以任意節點為根都可以,因為奇偶性

不變。

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma
GCC optimize(4) #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pi acos(-1.0) #define LL long long //#define mp make_pair #define pb push_back #define ls rt<<1, l, m #define rs rt<<1|1, m+1, r #define ULL unsigned LL #define pll pair<LL, LL> #define
pii pair<int, int> #define piii pair<pii, int> #define mem(a, b) memset(a, b, sizeof(a)) #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout); //head const int N = 3e5 + 10; int d[N]; vector<pii> g[N]; vector
<int> ans; bool vis[N]; void dfs(int u) { vis[u] = true; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i].fi; if(!vis[v]) { dfs(v); if(d[v] == 1) { ans.pb(g[u][i].se); if(d[u] != -1) d[u] ^= 1; } } } } int main() { int n, m, u, v, sum = 0, rt = 1; scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &d[i]); for (int i = 1; i <= n; i++) { if(d[i] != -1) sum += d[i]; else { rt = i; sum = 0; break; } } for (int i = 1; i <= m; i++) { scanf("%d %d", &u, &v); g[u].pb({v, i}); g[v].pb({u, i}); } if(sum&1) puts("-1"); else { dfs(rt); printf("%d\n", (int)ans.size()); for (int i = 0; i < ans.size(); i++) printf("%d\n", ans[i]); } return 0; }

Codeforces 841 D - Leha and another game about graph