RT
调了两天仍然是 70pts 整个人都不好了
Code:
# include<cstdio>
# include<iostream>
# include<queue>
# include<vector>
# include<cstring>
# define int long long
using namespace std;
const int N = 1e5 + 5, INF = 0x3f3f3f3f;
int n, k, x, a, b, ans, dis[N], cnt[N];
bool inq[N];
struct Edge {
int v, w;
} edge;
vector<Edge> G[N];
inline void add(int u, int v, int w) {G[u].push_back((Edge){v, w}); }
bool SPFA(int x) {
memset(inq, 0, sizeof inq);
memset(cnt, 0, sizeof cnt);
dis[x] = 0;
queue<int> q;
q.push(x); inq[x] = 1; cnt[x]++;
while(!q.empty()) {
register int v = q.front(), i; q.pop();
inq[v] = 0;
for(i = 0; i < G[v].size(); i++) {
register int j = G[v][i].v, w = G[v][i].w;
if(dis[v] + w > dis[j]) {
dis[j] = dis[v] + w;
if(!inq[j]) {
if(++cnt[j] >= n)
return 0;
q.push(j); inq[j] = 1;
}
}
}
}
return 1;
}
signed main() {
scanf("%lld%lld", &n, &k);
register int i;
for(i = 1; i <= n; i++) {
scanf("%lld%lld%lld", &x, &a, &b);
if(x == 1) add(a, b, 0), add(b, a, 0);
else if(x == 2) add(a, b, 1);
else if(x == 3) add(b, a, 0);
else if(x == 4) add(b, a, 1);
else if(x == 5) add(a, b, 0);
if(!(x & 1) && a == b) {
puts("-1");
return 0;
}
}
for(i = 1; i <= n; i++)
add(0, i, 1);
if(!SPFA(0)) {
puts("-1");
return 0;
}
for(i = 1; i <= n; i++)
ans += dis[i];
cout << ans;
return 0;
}