45分求调,仅t两个点
查看原帖
45分求调,仅t两个点
638148
liujiaxi123456楼主2022/11/15 11:24
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

namespace ljx_9420yy {

	const int maxn = 2505, maxm = 10005;
//	int w[maxn], w2[maxn];
	int vis[maxn][maxn], map[maxn][maxm], n, m, k, max2, max1, len[maxn];

	struct NOI {
		int ans, id;
	} w[maxn], w2[maxn];

	bool cmp(NOI a, NOI b) {
		return a.ans > b.ans;
	}

	void dfs(int x, int y, int cnt) {
		if(cnt>k)	return ;
		if(x != y) {
			vis[x][y] = 1;
			vis[y][x] = 1;
		}
		for(int i=1; i<=len[y]; i++) {
			if(vis[x][ map[y][i] ] == 0 || vis[ map[y][i] ][x] == 0) {
				if( x != map[y][i] ) {
					vis[x][ map[y][i] ] = 1;
					vis[ map[y][i] ][x] = 1;
					dfs(x, map[y][i], cnt+1);
				}
			}
		}
	}

	int main() {
		cin>> n>> m>> k;
		for(int i=2; i<=n; i++) {
			cin>> w[i].ans;
			w2[i].id = w[i].id = i;
			w2[i].ans = w[i].ans;
		}
		sort(w2+2, w2+2+n, cmp);
		w[1].id = w2[1].id = 1;
		for(int i=2; i<=n; i++) {
			w[w2[i].id].id = i;
//			printf("w[%d] = w2[%d] = %d\n", w2[i].id, i, w2[i].ans);
		}
		for(int i=1; i<=m; i++) {
			int x, y;
			cin>> x>> y;
			map[w[x].id][++len[x]] = w[y].id;
			map[w[y].id][++len[y]] = w[x].id;
		}
		for(int i=1; i<=n; i++) {
			dfs(i, i, 0);
		}
//		cout<< endl<< endl;
//		for(int i=1; i<=n; i++) {
//			for(int j=1; j<=n; j++) {
//				printf("vis[%d][%d] = %d\n", i, j, vis[i][j]);
//				if(vis[i][j] != vis[j][i])	printf("\nNO!\n");
//			}
//		}
//		for(int i=1; i<=n; i++) {
//			printf("w[%d] = %d	", i, w[i]);
//		}
//		printf("\n");
//		for(int i=1; i<=n; i++) {
//			printf("w2[%d] = %d	", i, w2[i]);
//		}
//		printf("\n");
		max2 = w2[1].ans + w2[2].ans + w2[3].ans + w2[4].ans;
		for(int i=2; i<=n; i++) {
			if(vis[1][i] == 0)	continue;
			for(int j=2; j<=n; j++) {
				if(i == j)	continue;
				if(vis[i][j] == 0)	continue;
				for(int k=2; k<=n; k++) {
					if(k == i || k == j)	continue;
					if(vis[j][k] == 0)	continue;
					for(int l=2; l<=n; l++) {
//						printf("%d, %d, %d, %d", i, j, k, l);
						if(l == k || l == j || l == i)	continue;
						if(vis[k][l] == 1 && vis[l][1] == 1) {
							max1 = max(max1, w2[i].ans + w2[j].ans + w2[k].ans + w2[l].ans);
//							printf("max1 = w2[%d]+w2[%d]+w2[%d]+w2[%d] = %d+%d+%d+%d = %d\n", i, j, k, l, w2[i].ans, w2[j].ans, w2[k].ans, w2[l].ans, w2[i].ans + w2[j].ans + w2[k].ans + w2[l].ans);
							if(max1 == max2) {
								cout<< max1;
								return 0;
							}
							break;
						}
//						else	printf("	vis[%d][%d] = %d	vis[%d][%d] = %d\n", k, l, vis[k][l], l, i, vis[l][i]);
					}
				}
			}
		}
		cout<< max1;
		return 0;
	}

}
int main() {
//	freopen("holiday3.in", "r", stdin);
	ljx_9420yy::main();
	return 0;
}
2022/11/15 11:24
加载中...