ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

hdu3072Intelligence System(缩图+贪心)

2021-04-02 20:34:43  阅读:159  来源: 互联网

标签:缩图 int System cost hdu3072Intelligence 数组 收费 模板 贪心


传送门

题意:给我们一个有向图,形成环的路线不需要收费,形成环的路线上的所有点不收费,

对于其余点,我们需找到一个生成树,花费最小

吐槽:这题把我人搞晕了,先是看题没看懂,没看到形成环的路线上的点不收费这条,然后就

使劲想也不可能做出来,看了题解还没一个正常的,全是抄一个人的,那个人还没注释,模板还跟我很不一样,

然后还写的很丑,变量定义那些巨怪,就能不创新数组就不创,我不知道你在节约个啥,多搞点数组会死啊,

终于看懂他的模板然后才知道环上的点不收费,然后套上自己的模板又超时了...思来想去以为是dfs死循环了

又写了个tuopo版本的贪心,结果还是超时,最后的最后发现是hd数组没初始化,我.....

思路:就是把先缩点,把那些不需要付钱的点去掉,然后再贪心

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 50100;
typedef long long ll;
struct edge {
	int f, t, w,nxt;
}e[maxn << 1];
int hd[maxn], tot;
void add(int f, int t,int w) {
	e[++tot] = { f,t,w,hd[f]};
	hd[f] = tot;
}
int n, m;
int low[maxn], dfn[maxn], cnt;
int stk[maxn], sk, instk[maxn];
int col[maxn], colnum;
int du[maxn],cost[maxn], vis[maxn];
void init() {
	memset(hd, 0, sizeof(hd));
	memset(dfn, 0, sizeof(dfn));
	memset(vis, 0, sizeof(vis));
	memset(du, 0, sizeof(du));
	memset(col, 0, sizeof(col));
	cnt = sk = colnum = tot = 0;
}
void tarjan(int u) {//缩点
	low[u] = dfn[u] = ++cnt;
	stk[++sk] = u; instk[u] = 1;
	for (int i = hd[u]; i; i = e[i].nxt) {
		int v = e[i].t;
		if (!dfn[v]) {
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}
		else if(instk[v]) {
			low[u] = min(low[u], dfn[v]);
		}
	}
	if (low[u] == dfn[u]) {
		colnum++;
		while (1) {
			int v = stk[sk--];
			instk[v] = 0;
			col[v] = colnum;
			if (v == u)break;
		}
	}
}
//void dfs(int u) {
//	if (vis[u])return;
//	vis[u] = 1;
//	for (int i = hd[u]; i; i = e[i].nxt) {
//		int v = e[i].t, w = e[i].w;
//		dfs(v);
//		if (w < cost[v])cost[v] = w;
//	}
//}
int tuopo() {//贪心
	queue<int>q;
	memset(cost, 0x3f, sizeof(cost));//初始化设置为一个很大的数
	for (int i = 1; i <= colnum; i++) {
		if (!du[i]) {
			cost[i] = 0;
			q.push(i);
		}
	}
	while (!q.empty()) {
		int u = q.front(); q.pop();
		for (int i = hd[u]; i; i = e[i].nxt) {
			int v = e[i].t, w = e[i].w;
			if (cost[v] > w)cost[v] = w;
			du[v]--;
			if (du[v] == 0) q.push(v);
		}
	}
	int ans = 0;
	for (int i = 1; i <= colnum; i++) {
		ans += cost[i];
	}
	return ans;
}
int main() {
	//freopen("test.txt", "r", stdin);
	while (~scanf("%d%d", &n, &m)) {
		init();
		for (int i = 1; i <= m;i++) {
			int a, b, w; scanf("%d%d%d", &a, &b, &w);
			add(a, b, w);
		}
		for (int i = 0; i < n; i++) {
			if (!dfn[i]) {
				tarjan(i);
			}
		}
		memset(hd, 0, sizeof(hd)); tot = 0;
		for (int i = 1; i <= m; i++) {//重新建图
			int u = e[i].f, v = e[i].t, w = e[i].w;
			if (col[u] != col[v]) {
				add(col[u], col[v], w);
				du[col[v]]++;
			}
		}
		/*
		memset(cost,0x3f,sizeof(cost));
		for (int i = 1; i <= colnum; i++) {
			if (du[i] == 0) {
				cost[i] = 0;
				dfs(i);
			}
		}*/
		/*int ans = 0;
		for (int i = 1; i <= colnum; i++) {
			ans += cost[i];
		}*/
		printf("%d\n",tuopo());
	}
	return 0;
}

  

标签:缩图,int,System,cost,hdu3072Intelligence,数组,收费,模板,贪心
来源: https://www.cnblogs.com/MYMYACMer/p/14612309.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有