Ball

题目描述

你有奇数个小球,依次被标号为1∼n和一架天平。已知所有的小球的质量都不一样,你用天平称了m次,根据这m次的结果,你是否能找到质量排序居中的那个球?

输入

第一行是一个整数T(1≤T≤100),表示样例的个数。 每个样例的第一行是两个整数n(3≤n≤99),m(n−1≤m≤n(n−1)2)。 以后的m行,每行两个整数a,b(1≤a≠b≤n),表示a比b重。 所有输入保证无矛盾,且同一组球不会被重复称重。

输出

每行输出一个样例的结果,即质量居中球的标号,如果找不到输出0;

样例输入

4
3 2
1 2
2 3

3 2
1 2
1 3

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

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

样例输出

2
0
4
0

法1,floyd求可达矩阵O(n^3)

  1. 每个球是一个顶点,如果两个球称过,就连一条有向边。
  2. 然后跑floyd,求可达矩阵。
  3. 如果某个顶点的入度和出度相同,都是(n-1)/2,那么这个球即所求。
#include<bits/stdc++.h>
using namespace std;
#define Debug(x) cout<<#x<<':'<<x<<endl
#define INF 0x7fffffff
typedef long long ll;
typedef pair<ll,ll> P;
const ll maxn=1e2+11;
ll g[maxn][maxn],dc[maxn],dr[maxn];
ll n,m;
void init(){memset(g,0,sizeof(g));memset(dc,0,sizeof(dc));memset(dr,0,sizeof(dr));
}
void floyd(){for(ll k=1;k<=n;k++){for(ll i=1;i<=n;i++){for(ll j=1;j<=n;j++){if(i==j)  continue;if(g[i][k] && g[k][j])  g[i][j]=1;}}}
}
void solve(){floyd();for(ll i=1;i<=n;i++){for(ll j=1;j<=n;j++){if(i==j)  continue;if(g[i][j])  dc[i]++,dr[j]++;}}ll ans=0;for(ll i=1;i<=n;i++)  if(dc[i]==dr[i] && dc[i]==(n-1)/2)  {ans=i;break;}cout<<ans<<endl;
}
int main(){ios::sync_with_stdio(false);cin.tie(0);ll ca;cin>>ca;while(ca--){init();cin>>n>>m;for(ll i=1;i<=m;i++){ll u,v;cin>>u>>v;g[u][v]=1;}solve();}   return 0;
}

法2,拓扑排序O(n*m)

这层级关系,不妥妥的拓扑排序嘛
假设a点为所求点,那么如果从a点可达n/2个点,反向建边后,从a点也可达n/2个点,那么这个点则为所求点。

#include<bits/stdc++.h>
using namespace std;
#define Debug(x) cout<<#x<<':'<<x<<endl
#define INF 0x7fffffff
typedef long long ll;
typedef pair<ll,ll> P;
const ll maxn=1e2+11;
const ll maxm=1e4+11;
struct Edge{ll to,nx;
}e[maxm];
ll head[maxn],dr[maxn],vis[maxn],num[maxn];
ll tmp,n,m;
set<ll> s;
vector<P> edge;
void init(){s.clear();edge.clear();memset(num,0,sizeof(num));memset(head,0,sizeof(head));memset(dr,0,sizeof(dr));tmp=1;
}
void add(ll u,ll v){e[tmp]={v,head[u]};head[u]=tmp++;}
void tuopu(){for(ll i=1;i<=n;i++){memset(vis,0,sizeof(vis));queue<ll> q;ll cnt=0;q.push(i);vis[i]=1;while(!q.empty()){ll u=q.front();q.pop();cnt++;for(ll i=head[u];i;i=e[i].nx){ll v=e[i].to;if(vis[v])  continue;vis[v]=1;q.push(v);}}if(cnt==n/2+1){s.insert(i);num[i]++;}}
}
void solve(){vector<ll> ans;tuopu();memset(head,0,sizeof(head));memset(dr,0,sizeof(dr));tmp=1;for(auto i=edge.begin();i!=edge.end();i++){ll u=(*i).second,v=(*i).first;add(u,v);dr[v]++;}tuopu();for(auto i=s.begin();i!=s.end();i++){if(num[*i]==2)  ans.push_back(*i);}if(ans.size()==1)  cout<<ans[0]<<endl;else  cout<<0<<endl;
}
int main(){ios::sync_with_stdio(false);cin.tie(0);ll ca;cin>>ca;while(ca--){init();cin>>n>>m;for(ll i=1;i<=m;i++){ll u,v;cin>>u>>v;add(u,v);dr[v]++;edge.push_back({u,v});}solve();}return 0;
}

xtu 1370 ball相关推荐

  1. CUDA Samples: green ball

    以下CUDA sample是分别用C++和CUDA实现的生成的绿色的球图像,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第五章,各个文件内容 ...

  2. Aizu - 0033 Ball

    这题书上写让用DFS--可是这一比较就出来啊-- Ball Aizu - 0033 図のように二股に分かれている容器があります.1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A か ...

  3. AOJ0033 Ball【贪心+序列处理】

    図のように二股に分かれている容器があります.1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A から落とし.左の筒 B か右の筒 C に玉を入れます.板 D は支点 E を中心に左右 ...

  4. 【中国剩余定理】POJ 1006 HDU 1370 Biorhythms

    题目链接: http://poj.org/problem?id=1006 http://acm.hdu.edu.cn/showproblem.php?pid=1370 题目大意: (X+d)%23=a ...

  5. hdu-4811 Ball

    题目链接: Ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. hdu 1556 Color the ball

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. Color the ball

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. 零样本性能超越GPT-3!谷歌提出1370亿参数自回归语言模型

    ©作者 | 机器之心编辑部 来源 | 机器之心 在 NLP 领域,pretrain-finetune 和 prompt-tuning 技术能够提升 GPT-3 等大模型在各类任务上的性能,但这类大模型 ...

  9. Hihocoder 1370 快乐数字

    点击打开链接 快来数字 判断一个正整数是否是快乐数字? 如果一个数字能够通过有限次快乐变换成为1,则是快乐数字. 快乐变换是对一个数字的每一位的平方数求和. 例如: 对于68 68 => 62+ ...

  10. LightOJ 1370 - Bi-shoe and Phi-shoe

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1370 题意:给你n个数,每个数要找一个欧拉函数值大于等于这个数,并求和. 题解:就是素 ...

最新文章

  1. 老赵的自然数分解——少侠之对象解
  2. poj 2449 A*求k短路
  3. Okhttp3中设置超时的方法
  4. 电脑上怎么配置mysql数据库服务器_Mysql数据库服务器安装与配置详解教程
  5. ArcGIS实验教程——实验二十三:专题地图制作完整实验步骤
  6. 【Android】Uri和Url和URN
  7. Maven错误 diamond operator is not supported in -source 1.5 (use -source 7 or higher to enable diamond
  8. 构建微服务体系结构的最佳实践
  9. 三菱PLC软件有LINUX版本吗,三菱PLC编程软件(GX Developer)
  10. 利用TextRank算法制作一个可以提取聊天关键词的QQ群机器人
  11. 崩溃!因对领导不满前网管离职后远程入侵服务器,致诊疗系统瘫痪!
  12. C++核心准则T.10:为所有的模板参数定义概念
  13. STM32串口DMA方式接收数据。类似环形FIFO。超省CPU资源!
  14. 令人肝肠寸断的100个签名
  15. 小鲨鱼在51nod小学
  16. linux终端能显示中文,但是不能输入中文的解决方法
  17. Go 语言实战: 编写可维护 Go 语言代码建议
  18. 【状压+容斥】BZOJ4455 [ZJOI2016] 小星星
  19. 2018全球互联网经济大会,春季峰会在南京开幕
  20. 2022年元旦新年亲子活动方案

热门文章

  1. 英语 动词过去式和过去分词的变化规则
  2. 圣人、仁人、君子、善人、士、小人之名简释
  3. java clone 对象_为什么阿里Java手册推荐慎用 Object 的 clone 方法来拷贝对象
  4. Cadence 16.6快速创建多引脚芯片原理图符号
  5. Ubuntu修改/home下各目录为英文
  6. java bitset javadoc,BitSet的源码研究
  7. 求方程式ax2bxc0的根c语言,2019-03-09 C语言学习12-求ax^2+bx+c=0方程的根
  8. MACD:黄白线、红绿柱与0轴关系
  9. 工作经验分享:为什么我们要写Unti Test
  10. 抱抱脸(hugging face)教程-中文翻译-使用 Tokenizers 的 tokenizers