CF24A Ring road 题解

不理解为什么那么多人想得复杂了。

这里提供一种贪心的方法。

其实很好想,思路如下:

一共有两种情况,取其较小的即可。

第一种方法:

凡是遇到一个已经存了的点,就用 \(cnt\) 累加费用,然后存边。

第二种方法:

与第一种相反,修改剩余。

代码也很好写,没什么可讲的。

#include<bits/stdc++.h>

using namespace std;

int n,x,y,z;
int cnt,sum;
bool from[110],to[110];

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x>>y>>z;
		if(from[x]) from[y]=1,to[x]=1,cnt+=z; //如果有连接两点的边,cnt 累计并反向存边
		else if(to[y]) from[y]=1,to[x]=1,cnt+=z;
		else from[x]=1,to[y]=1; //如果没有,则直接存
		sum+=z; //累计总和
	}
	cout<<min(sum-cnt,cnt); //输出两种方法的最小的
	return 0;
}

我的代码有防作弊哦!

posted @ 2021-11-17 22:30  iFear  阅读(29)  评论(0)    收藏  举报
Live2D