#include #include #include using namespace std; typedef int LL; struct Edge { int u, v; LL cap, flow; Edge() {} Edge(int u, int v, LL cap): u(u), v(v), cap(cap), flow(0) {} }; struct Dinic { int N; vector E; vector> g; vector d, pt; Dinic(int N): N(N), E(0), g(N), d(N), pt(N) {} void AddEdge(int u, int v, LL cap) { if (u != v) { E.emplace_back(u, v, cap); g[u].emplace_back(E.size() - 1); E.emplace_back(v, u, 0); g[v].emplace_back(E.size() - 1); } } bool BFS(int S, int T) { queue q({S}); fill(d.begin(), d.end(), N + 1); d[S] = 0; while(!q.empty()) { int u = q.front(); q.pop(); if (u == T) break; for (int k: g[u]) { Edge &e = E[k]; if (e.flow < e.cap && d[e.v] > d[e.u] + 1) { d[e.v] = d[e.u] + 1; q.emplace(e.v); } } } return d[T] != N + 1; } LL DFS(int u, int T, LL flow = -1) { if (u == T || flow == 0) return flow; for (int &i = pt[u]; i < g[u].size(); ++i) { Edge &e = E[g[u][i]]; Edge &oe = E[g[u][i]^1]; if (d[e.v] == d[e.u] + 1) { LL amt = e.cap - e.flow; if (flow != -1 && amt > flow) amt = flow; if (LL pushed = DFS(e.v, T, amt)) { e.flow += pushed; oe.flow -= pushed; return pushed; } } } return 0; } LL MaxFlow(int S, int T) { LL total = 0; while (BFS(S, T)) { fill(pt.begin(), pt.end(), 0); while (LL flow = DFS(S, T)) total += flow; } return total; } }; Dinic* dinic; int main() { int n, m; cin >> n >> m; int src = 2*n; int snk = 2*n+1; dinic = new Dinic(2*n+2); for(int i = 0; i < n; i++) dinic->AddEdge(i, i+n, 2); for(int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; dinic->AddEdge(a+n, b, 1e9); dinic->AddEdge(b+n, a, 1e9); } string s; cin >> s; for(int i = 0; i < n; i++) { if(s[i] == '0') dinic->AddEdge(src, i, 1); else dinic->AddEdge(i+n, snk, 1); } cout << dinic->MaxFlow(src, snk) << "\n"; }