链接:https://www.nowcoder.com/acm/contest/117/F
来源:牛客网

汤圆防漏理论
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

ghc很喜欢吃汤圆,但是汤圆很容易被粘(zhān)漏。

根据多年吃汤圆经验,ghc总结出了一套汤圆防漏理论:

互相接触的汤圆容易粘(zhān)在一起,并且接触面积不同,粘(zhān)在一起的粘(nián)度也不同。

当ghc要夹起一个汤圆时,这个汤圆和现在碗里与这个汤圆接触的所有汤圆之间的粘(nián)度的和,如果大于汤圆的硬度,这个汤圆就会被粘(zhān)漏。

今天ghc又要煮汤圆啦,今天要煮n个汤圆,并且摆盘的方法已经设计好:

汤圆按照编号,有m对汤圆互相接触,用xi, yi, zi表示编号为xi和yi的两个汤圆互相接触,粘(nián)度为zi

汤圆当然是越软越好吃,但是ghc的厨艺只允许把所有汤圆煮成同样的硬度。那么,汤圆的硬度最小可以是多少,可以满足吃的过程中,存在一种夹汤圆的顺序,使得没有汤圆会被粘(zhān)漏呢?

注意:

不考虑汤圆的重力作用;

不能同时夹多个汤圆;

吃完汤圆一定要喝点汤。

输入描述:

第一行是一个正整数T(≤ 5),表示测试数据的组数,

对于每组测试数据,

第一行是两个整数n,m(1≤ n,m≤ 100000),

接下来m行,每行包含三个整数xi, yi, zi(1≤ xi, yi ≤ n, xi ≠ yi, 1 ≤ zi ≤ 1000000),

同一对汤圆不会出现两次。

输出描述:

对于每组测试数据,输出一行,包含一个整数,表示汤圆硬度的最小值。

输入例子:
1
4 6
1 2 2
1 3 2
1 4 2
2 3 3
2 4 3
3 4 5
输出例子:
6

-->

示例1

输入

复制

1
4 6
1 2 2
1 3 2
1 4 2
2 3 3
2 4 3
3 4 5

输出

复制

6

法一:直接算

#include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + ;

using LL = long long;
using P = pair<LL, int>; LL cnt[N];
int n, m; set<P> edge[N]; priority_queue<P, vector<P>, greater<P> > Q; void Work()
{
LL ans = ;
for(int i = ; i <= n; i++)
{
Q.push({cnt[i], i});
}
while(!Q.empty())
{
auto tmp = Q.top(); Q.pop();
if(tmp.first != cnt[tmp.second]) continue;
int u = tmp.second;
ans = max(ans, tmp.first);
for(auto p : edge[u])
{
int v = p.second;
cnt[v] -= p.first;
edge[v].erase({p.first, u});
Q.push({cnt[v], v});
}
}
cout << ans << endl;
} int main()
{
int T;
cin >> T;
while(T--)
{
cin >> n >> m;
for(int i = ; i <= n; i++)
{
edge[i].clear();
cnt[i] = ;
} int u, v, w;
for(int i = ; i <= m; i++)
{
cin >> u >> v >> w;
cnt[u] += w;
cnt[v] += w;
edge[u].insert({w, v});
edge[v].insert({w, u});
}
Work();
} }
#include<cstdio>
#include<cmath>
#include<set>
#include<queue>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
#define ll long long
#define N 100000
#define mod 1000000007
#define pa pair<ll,ll>
vector<pa>g[N+];
set<pa>p;
ll sum[N+]; //表示编号为i的人的粘稠度综合
bool vis[N+]; //去重
int main()
{
int i,j,t,q,n,m,a,b,w,x;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=;i<=n;i++) //p不需要清了,本来就是空的
{
g[i].clear();
sum[i]=;
vis[i]=false;
}
while(m--)
{
scanf("%d%d%d",&a,&b,&w);
g[a].push_back(pa(b,w));
g[b].push_back(pa(a,w)); //将a,b连接起来
sum[a]+=w;
sum[b]+=w;
}
for(i=;i<=n;i++)
p.insert(pa(sum[i],i)); //将数据输入到set
ll maxd=;
while(!p.empty()) //贪心
{
set<pa>::iterator it=p.begin();
pa now= *it; //now.first表示他的粘稠度,now,second表士坐标
p.erase(*it);
maxd=max(now.first,maxd);
// printf("%lld now.first=%lld\n",maxd,now.first);
x=now.second;
vis[x]=true; //标记
//第一步,删除权值的边
for(i=;i<g[x].size();i++)
{
pa l=g[x][i]; //为了理解,再写下,l.first是x对应的边
if(vis[l.first])
continue;
p.erase(pa(sum[l.first],l.first));
sum[l.first]-=l.second;
p.insert(pa(sum[l.first],l.first));
} }
printf("%lld\n",maxd);
} return ;
}
题解:
二分硬度,拓扑排序判断是否可行
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+;
struct node
{
int to;ll cost;
};
vector<node>p[maxn];
queue<int>P;
ll a[maxn],zz[maxn];
bool vis[maxn];
int n,m,xx[maxn],yy[maxn];
bool pp(ll x)
{
for(int i=;i<=n;i++)p[i].clear();
memset(a,,sizeof(a));
for(int i=;i<m;i++)
{
node e;e.to=yy[i];e.cost=zz[i];
p[xx[i]].push_back(e);
e.to=xx[i];
p[yy[i]].push_back(e);
a[xx[i]]+=zz[i];
a[yy[i]]+=zz[i];
}
int ans=;memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)
{
if(!vis[i]&&a[i]<=x)
{
ans++;
vis[i]=;
for(int j=;j<p[i].size();j++)
{
int to=p[i][j].to;ll z=p[i][j].cost;
a[to]-=z;
if(!vis[to]&&a[to]<=x)P.push(to),ans++,vis[to]=;
}
}
}
while(!P.empty())
{
int v=P.front();P.pop();
for(int i=;i<p[v].size();i++)
{
node e=p[v][i];
a[e.to]-=e.cost;
if(!vis[e.to]&&a[e.to]<=x)P.push(e.to),ans++,vis[e.to]=;
}
}
if(ans==n)return ;
return ;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)
{
int x,y;ll z;
scanf("%d%d%lld",&x,&y,&z);
xx[i]=x;yy[i]=y;zz[i]=z;
}
ll l=-,r=1e18;
while(r-l>)
{
ll mid=(l+r)/;
if(pp(mid))r=mid;
else l=mid;
}
printf("%lld\n",r);
}
return ;
}

北京师范大学第十六届程序设计竞赛决赛 F 汤圆防漏理论的更多相关文章

  1. 北京师范大学第十六届程序设计竞赛决赛 I 如何办好比赛

    链接:https://www.nowcoder.com/acm/contest/117/I来源:牛客网 如何办好比赛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...

  2. 北京师范大学第十六届程序设计竞赛决赛-重现赛-B题

    一.题目链接 https://www.nowcoder.com/acm/contest/117/B 二.题意 给定一组序列$a_1,a_2,\cdots,a_n$,表示初始序列$b_1,b_2,\cd ...

  3. 北京师范大学第十六届程序设计竞赛决赛 C萌萌哒身高差

    链接:https://www.nowcoder.com/acm/contest/117/C来源:牛客网 萌萌哒身高差 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...

  4. 西电大第十六届程序设计竞赛 A-GRE

    题目描述    不愤不启不悱不发,王萌萌为了能够成功上研,开始刻苦背GRE单词,但是由于她过于刻苦,在背会英语单词的同时,把中文读音忘了.于是王萌萌又开始复习起中文发音,她先从数字开始复习起...  ...

  5. HDU 6467 简单数学题 【递推公式 && O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others)    M ...

  6. HDU 6464 免费送气球 【权值线段树】(广东工业大学第十四届程序设计竞赛)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6464 免费送气球 Time Limit: 2000/1000 MS (Java/Others)    M ...

  7. HDU 6470 Count 【矩阵快速幂】(广东工业大学第十四届程序设计竞赛 )

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6470 Count Time Limit: 6000/3000 MS (Java/Others)    ...

  8. HDU 6467.简单数学题-数学题 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  9. HDU 6464.免费送气球-动态开点-权值线段树(序列中第first小至第second小的数值之和)(感觉就是只有一个状态的主席树) (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    免费送气球 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

随机推荐

  1. redhat9安装gcc(转)

    原文链接:http://blog.chinaunix.net/uid-20260767-id-118036.html 第一种方法: 相信现在还有不少人在用经典的RedHat9,毕竟他是完全免费的红帽L ...

  2. Python基础学习----元组

    # 元组和列表的区别: # 相同点: # 1.表示多个元素的序列 # 2.数据之间用 , 分开 # 3.索引都是[0]开始 # # 不同点: # 1.列表创建是[],元组是()表示 # 2.元组元素一 ...

  3. L166

    THE idea of underwater mining is not restricted to the ocean floor (see article). High water tables ...

  4. 如何修改MyEclipse的默认编码方式

    在创建jsp页面时,默认首行出现“<%@ page language="java" import="java.util.*" pageEncoding=& ...

  5. CentOS常用命令汇总

    将新创建的数据分配某个用户访问 grant all privileges on zhouzdb.* to 'zhouz'@'%' identified by '1234'; flush privile ...

  6. php 路径问题

    今天迁移网站服务器时,路径出错: 解决办法: 在网站首页根目录 设置define 全局变量 ——根目录: 在涉及目录的地方,统统替换为 根目录:

  7. 【剑指offer】二叉树中和为某一值的路径,C++实现

    原创文章,转载请注明出处! 博客文章索引地址 1.题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径由结点和有向边组成,从根结点到叶节点. // 二叉树结点的定义 st ...

  8. 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)

    目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...

  9. 每天一个linux命令:【转载】head命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...

  10. Create A .NET Core Development Environment Using Visual Studio Code

    https://www.c-sharpcorner.com/article/create-a-net-core-development-environment-using-visual-studio- ...