50分???
查看原帖
50分???
559847
Ferm_Tawn楼主2022/8/19 21:12

觉得贪心可过,但......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;
}
2022/8/19 21:12
加载中...