觉得贪心可过,但......50分
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge{
int x , a , b;
} q[1000005];
int a[1000005];
bool flag;
int n , k , minx , res;
signed main(){
cin >> n >> k;
for(int i = 1 ; i <= k ; i++){
cin >> q[i].x >> q[i].a >> q[i].b;
}
for(int t = 1 ; t <= 200 ; t++){
for(int i = 1 ; i <= k ; i++){
if(q[i].x == 1){
if(a[q[i].a] != a[q[i].b]) a[q[i].a] = a[q[i].b];
}
else if(q[i].x == 2){
if(a[q[i].a] >= a[q[i].b]) a[q[i].a] = a[q[i].b] - 1;
}
else if(q[i].x == 3){
if(a[q[i].a] < a[q[i].b]) a[q[i].a] = a[q[i].b];
}
else if(q[i].x == 4){
if(a[q[i].a] <= a[q[i].b]) a[q[i].a] = a[q[i].b] + 1;
}
else if(q[i].x == 5){
if(a[q[i].a] > a[q[i].b]) a[q[i].a] = a[q[i].b];
}
}
}
minx = 1e18;
for(int i = 1 ; i <= n ; i++){
minx = min(minx , a[i]);
}
if(minx <= 0){
for(int i = 1 ; i <= n ; i++){
a[i] += (-minx + 1);
}
}
flag = true;
for(int i = 1 ; i <= k ; i++){
if(q[i].x == 1){
if(a[q[i].a] != a[q[i].b]) flag = false;
}
else if(q[i].x == 2){
if(a[q[i].a] >= a[q[i].b]) flag = false;
}
else if(q[i].x == 3){
if(a[q[i].a] < a[q[i].b]) flag = false;
}
else if(q[i].x == 4){
if(a[q[i].a] <= a[q[i].b]) flag = false;
}
else if(q[i].x == 5){
if(a[q[i].a] > a[q[i].b]) flag = false;
}
}
if(flag == false){
cout << -1;
return 0;
}
for(int i = 1 ; i <= n ; i++){
res += a[i];
}
cout << res;
return 0;
}