ABC F WA 1 个点求调
  • 板块题目总版
  • 楼主WhileTrueRP
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/4 21:42
  • 上次更新2024/5/5 08:19:59
查看原帖
ABC F WA 1 个点求调
373198
WhileTrueRP楼主2024/5/4 21:42
#include<bits/stdc++.h>
using namespace std;
const int N = 18;
const int M = 300;
int a[M],b[M],c[M],minn[N],maxn[N];
bool vis[N];
vector<pair<int,int> > v[N];
int n,m;
int rnk[N],ans[N];
void dfs(int now){
	if(now == n+1){
		for(int i=1;i<=n;i++){
			if(ans[i] == 0){
				ans[i] = rnk[i];
			}else if(rnk[i] != ans[i]){
				ans[i] = -1;
			}
		}
		return;
	}
	for(int i=minn[now];i<=maxn[now];i++){
		if(!vis[i]){
			bool flag = false;
			for(int j=0;j<v[now].size();j++){
				int u = v[now][j].first;
				int w = v[now][j].second;
				if(rnk[u] != 0 && rnk[u]-i != w){
					flag = true;
				}
			}
			if(flag){
				continue;
			}
			rnk[now] = i;
			vis[i] = true;
			dfs(now + 1);
			vis[i] = false;
			rnk[now] = 0;
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	if(m*2+3 < n){
		for(int i=1;i<=n;i++){
			printf("-1 ");
		}
		exit(0);
	}
	for(int i=1;i<=n;i++){
		minn[i] = 1;
		maxn[i] = n;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&a[i],&b[i],&c[i]);
		minn[a[i]] = max(minn[a[i]],c[i]+1);
		maxn[b[i]] = min(maxn[b[i]],n-c[i]);
		
		v[a[i]].push_back(make_pair(b[i],-c[i]));
		v[b[i]].push_back(make_pair(a[i],c[i]));
	}
	dfs(1);
	for(int i=1;i<=n;i++){
		printf("%d ",ans[i]?ans[i]:-1);
	}
}
2024/5/4 21:42
加载中...