玄学氧气优化
查看原帖
玄学氧气优化
704840
limuy楼主2023/8/1 15:44
#include <bits/stdc++.h>
using namespace std;

#define INF 1917483645
long long c[20][20];
long long tar[50][50];
long long lev[50];
long long vis[50];
long long n, m, ans = INT_MAX, tmp, tot, cnt;

void dfs(long long num, long long node) {
	for(long long i = num; i <= cnt; ++i) {
		if(tot + tmp * lev[vis[i]] >= ans) {
			return;
		}
		for(long long j = node; j <= tar[vis[i]][0]; ++j) {
			if(!lev[tar[vis[i]][j]]) {
				cnt++;
				vis[cnt] = tar[vis[i]][j];
				tmp -= c[vis[cnt]][tar[vis[cnt]][1]];
				tot += c[vis[i]][vis[cnt]] * lev[vis[i]];
				lev[vis[cnt]] = lev[vis[i]] + 1;
				dfs(i, j + 1);
				tot -= c[vis[i]][vis[cnt]] * lev[vis[i]];
				lev[vis[cnt]] = 0;
				tmp += c[vis[cnt]][tar[vis[cnt]][1]];
				cnt--;
			}
		}
		node = 1;
	}
	if(cnt == n) {
		ans = min(tot, ans);
		return;
	}
}

signed main() {
    scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; i ++)
    	for(int j = 1; j <= n; j ++)
    		c[i][j] = INF;
	for(long long i = 1; i <= m; ++i) {
        long long a, b, v;
        scanf("%d %d %d", &a, &b, &v);
        if(v > c[a][b]) {
        	continue;
        }
        if(c[a][b] == INF) {
        	tar[a][++tar[a][0]] = b;
        	tar[b][++tar[b][0]] = a;
        }
        c[a][b] = c[b][a] = v;
    }
	for(long long i = 1; i <= n; ++i) {
		sort(tar[i] + 1, tar[i] + 1 + tar[i][0], [=](long long a, long long b) {
			return c[i][a] < c[i][b];	
		});
		tmp += c[i][tar[i][1]];
	}
	for(long long i = 1; i <= n; ++i) {
		tot = 0;
		cnt = 1;
		vis[1] = i;
		tmp -= c[i][tar[i][1]];
		lev[i] = 1;
		dfs(1, 1);
		lev[i] = 0;
		tmp += c[i][tar[i][1]];
	}
	printf("%d", ans);
    return 0;
}

这份代码是跟着第一篇题解写的,发生了很玄学的事情,不开O2只有5分,其他都是RE.数据点拿到本地测也没问题。但是洛谷一开O2就AC了,求大佬找找原因

2023/8/1 15:44
加载中...