下面这份代码在C++11下编译错误(问题出在unordered_map
上,跟其他内容应该没有关系),应该怎么改
#include <map>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <unordered_map>
using namespace std;
#define PII pair<int, int>
#define mp(a, b) make_pair(a, b)
const int N = 1e5 + 5;
int T, n, m, q, cnt, ans[5], deg[N], head[N], c[N], sum[N][2];
struct EDGE {
int nxt, to, w;
}e[N << 1];
vector <PII > g[N];
unordered_map<PII, int> M;
void add(int u, int v, int w) {
e[++cnt].nxt = head[u], e[cnt].to = v, e[cnt].w = w, head[u] = cnt;
}
int main() {
scanf("%d", &T);
while(T--) {
cnt = 0;
M.clear();
memset(ans, 0, sizeof(ans));
memset(head, 0, sizeof(head));
memset(sum, 0, sizeof(sum));
memset(deg, 0, sizeof(deg));
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", c + i), g[i].clear();
for(int i = 1; i <= m; i++) {
int u, v, w; scanf("%d%d%d", &u, &v, &w);
if(c[u] && c[v]) ans[3] += w;
else if(!c[u] && !c[v]) ans[1] += w;
else ans[2] += w;
if(M[mp(min(u, v), max(u, v))]) {
e[M[mp(min(u, v), max(u, v))]].w += w;
e[M[mp(min(u, v), max(u, v))] - 1].w += w;
continue;
}
deg[u]++, deg[v]++;
add(u, v, w), add(v, u, w);
M[mp(min(u, v), max(u, v))] = cnt;
}
int k = sqrt(m);
for(int i = 1; i <= n; i++) {
for(int j = head[i]; j; j = e[j].nxt) {
int v = e[j].to, w = e[j].w;
if(deg[v] >= k) g[i].push_back(mp(v, w));
if(deg[i] >= k) sum[i][c[v]] += w;
}
}
scanf("%d", &q);
while(q--) {
int opt; scanf("%d", &opt);
if(opt == 1) {
int x; scanf("%d", &x);
if(deg[x] < k) {
for(int i = head[x]; i; i = e[i].nxt) {
int v = e[i].to, w = e[i].w;
if(deg[v] >= k) sum[v][c[x]] -= w, sum[v][!c[x]] += w;
if(c[x] && c[v]) ans[3] -= w, ans[2] += w;
else if(!c[x] && !c[v]) ans[1] -= w, ans[2] += w;
else if(c[x]) ans[2] -= w, ans[1] += w;
else ans[2] -= w, ans[3] += w;
}
c[x] = !c[x];
}
else {
for(int i = 0; i < g[x].size(); i++) {
int v = g[x].at(i).first, w = g[x].at(i).second;
sum[v][c[x]] -= w, sum[v][!c[x]] += w;
}
if(c[x]) ans[3] -= sum[x][1], ans[2] += sum[x][1], ans[2] -= sum[x][0], ans[1] += sum[x][0];
else ans[1] -= sum[x][0], ans[2] += sum[x][0], ans[2] -= sum[x][1], ans[3] += sum[x][1];
c[x] = !c[x];
}
}
else {
int a, b; scanf("%d%d", &a, &b);
if(a & b) printf("%d\n", ans[3]);
else if(a | b) printf("%d\n", ans[2]);
else printf("%d\n", ans[1]);
}
}
}
return 0;
}