Hard Molecules

给定一个连通图中每个点的度数,求一个满足条件的图,图可以有重边,不能有自环。

n<=5000, di<=109

题解

如果不要求图连通,那么只需要判断

\[\sum d_i \mod 2=0\\
\max\{d_i\} \leq \frac{\sum d_i}{2}
\]

然后将度数分成两部分连边即可。

现在要求图连通,那么就先做一棵生成树出来。

由于我们想让每个点的非树边最大度数最小,所以我们可以贪心:维护一棵树,每次选择树上度数最大的点和树外度数最大的点连边。

CO int N=5000+10;
int n,d[N],G[N][N]; IN void connect(int x,int y,int w){
G[x][y]+=w,G[y][x]+=w;
d[x]-=w,d[y]-=w;
} bool vis[N]; bool build_tree(){
int root=1;
for(int i=2;i<=n;++i)
if(d[i]>d[root]) root=i;
vis[root]=1;
for(int t=1;t<n;++t){
int a=-1;
for(int i=1;i<=n;++i)if(vis[i])
if(a==-1 or d[i]>d[a]) a=i;
int b=-1;
for(int i=1;i<=n;++i)if(!vis[i])
if(b==-1 or d[i]>d[b]) b=i;
if(a==-1 or b==-1) return 0;
if(d[a]==0 or d[b]==0) return 0;
connect(a,b,1);
vis[b]=1;
}
return 1;
} typedef pair<int,int> pii;
vector<pii> L,R; bool check(){
LL tot=0;
for(int i=1;i<=n;++i) tot+=d[i];
if(tot&1) return 0;
tot>>=1;
for(int i=1;i<=n;++i)
if(d[i]>tot) return 0;
for(int i=1;i<=n;++i)if(d[i]){
if(tot>=d[i]){
tot-=d[i];
L.push_back(pii(d[i],i));
}
else{
if(tot) L.push_back(pii(tot,i));
R.push_back(pii(d[i]-tot,i));
tot=0;
}
}
return 1;
}
int main(){
read(n);
for(int i=1;i<=n;++i) read(d[i]);
if(build_tree() and check()){
puts("Yes");
for(int i=0,p=0;i<(int)L.size();++i){
for(;p<(int)R.size() and L[i].first>=R[p].first;++p){
connect(L[i].second,R[p].second,R[p].first);
L[i].first-=R[p].first;
}
if(L[i].first){
connect(L[i].second,R[p].second,L[i].first);
R[p].first-=L[i].first;
}
}
for(int i=1;i<=n;++i,puts(""))
for(int j=i+1;j<=n;++j) printf("%d ",G[i][j]);
}
else puts("No");
return 0;
}

最新文章

  1. Struts2 文件上传和文件下载
  2. java分享第八天-01(线程)
  3. AFNetworking 2.0指北
  4. Access应用日志&lt;一&gt;
  5. 第七天:JS内置对象-String字符串对象
  6. 不是语言之争--Go vs Erlang
  7. mysql+mybatis 插入可递增字段库表操作
  8. shell编程的一些例子2
  9. iOS开发——OC篇&amp;OC高级语法
  10. CodedDFS日志配置
  11. IT忍者神龟之Struts2.xml配置全然正确流程能走通可是有红叉解决
  12. Ext JS学习第四天 我们所熟悉的javascript(三)
  13. NSAttributedString 的21种属性 详解
  14. 【Android Developers Training】 35. 序言:分享文件
  15. zookeeper 学习 状态机复制的共识算法
  16. Jmeter-连接 MySQL数据库
  17. mysql 解压版方法
  18. Unity3D学习笔记——Android远程真机调试(Unity Remote)
  19. 从程序员到CTO的Java技术路线图 JAVA职业规划 JAVA职业发展路线图 系统后台框架图、前端工程师技能图 B2C电子商务基础系统架构解析
  20. [AIR] 检测移动设备运动

热门文章

  1. 关于Linux TCP &quot;SACK PANIC&quot; 远程拒绝服务漏洞的修复
  2. StringTable
  3. 9. Scala隐式转换和隐式值
  4. Tomcat 部署 Jenkins (Linux系统)
  5. myeclipse安装android开发环境全过程
  6. python面试题_01
  7. [SOJ #696]染色(2019-11-10考试)/[Atcoder MUJIN Programming Challenge C]Orange Graph
  8. (原创)理解主机设备(PLC,PC机)之间的以太网通信
  9. final,finally,finalize之间的区别。
  10. python使用pymysql操作mysql数据库