可以直接见这个博客:http://blog.csdn.net/black_miracle/article/details/52164974

  对其中的几点作一些解释:

  1.这个方法我们对队列中取出的元素,把仍有出度的点连接到这个点时,这个点是不会连接到多余的点的,因为:一个点出队列的时候其他没入队的点都已经连接到这个点过了,后来再一个点出队列的时候,我们拿此时没入队的点连接到它时,肯定已经连接过之前的点了,所以肯定不会增加到达的点数。(可能我也用语言讲不太清楚233。。。)

  2.为什么这个人的博客说最终如果num不是0的话就表示成环了?理由如下:不妨考虑四个点的情况:3,3,3,0。最后一个点操作后,出度变为2,2,2,0。这个时候队列已经空了,然而num还不是0,说明还有点没有完成达到它所需要达到的点数(也可以这么解释:num的个数表示还没有完成点数个数任务的点的个数,num=0才表示所有的点都已经完成到达点数个数的目标了,不是0当然不能够满足题意了)。至于为什么是成环的话,因为它们不能够完成点数个数任务,所以他们必须连向别人构成环来构成目标了呗~

  反正这个拓扑排序有点奥义,需要好好理解~

  代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <set>
#include <queue>
using namespace std;
const int N = + ; struct edge
{
int u,v;
bool operator < (const edge &temp) const
{
return u == temp.u ? v<temp.v : u<temp.u;
}
};
int a[N],inq[N],n;
set<edge> S; void solve()
{
queue<int> Q;
int cnt = n;
for(int i=;i<=n;i++)
{
if(!a[i])
{
Q.push(i);
inq[i] = ;
cnt--;
}
}
while(!Q.empty())
{
int x = Q.front();Q.pop();
for(int i=;i<=n;i++)
{
if(!inq[i])
{
a[i]--;
S.insert((edge){i,x});
if(!a[i])
{
Q.push(i);
inq[i] = ;
cnt--;
}
}
}
}
if(cnt) puts("No");
else
{
puts("Yes");
printf("%d\n",S.size());
for(set<edge>::iterator it=S.begin();it!=S.end();it++)
{
edge e = *it;
printf("%d %d\n",e.u,e.v);
}
}
} int main()
{
int T;scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
scanf("%d",&n);
S.clear();memset(inq,,sizeof(inq));
for(int i=;i<=n;i++) scanf("%d",a+i);
printf("Case #%d: ",kase);
solve();
}
return ;
}

最新文章

  1. TDR分辨率
  2. .Net魔法堂:提取注释生成API文档
  3. ios app 提交评审注意事项
  4. ruby实时查看日志
  5. 掌握这两个技术点,你可以玩转AppCan前端开发
  6. (转)iOS动画Core Animation
  7. linux内核-双向链表
  8. JS笔记2 --定义对象
  9. STL 之 vector 用法
  10. Tosska SQL Tuning Expert 工具优化SQL语句
  11. hdu 4409 Family Name List(LCA&amp;amp;有坑点)
  12. Go使用flag包开发命令行工具
  13. BFS学习 Codeforces 301_div.2_Ice Cave
  14. Caffe+VS2015+python3的安装(基于windows)
  15. 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
  16. LightCapture for Mac(流程化截图工具)破解版安装
  17. Delete触发器
  18. 20170809直接访问功能测试Postman
  19. 了解innodb_support_xa(分布式事务)
  20. PDF,word ,PPT,等各种文件转换在线工具(免费)

热门文章

  1. Java object-oriented8/5
  2. [转载]为什么用Java开发桌面程序的比较少
  3. Python算法题(一)——青蛙跳台阶
  4. Redis-Hash常用命令
  5. 记一次被自己DDOS攻击
  6. C# 使用Quartz.Net
  7. Solr集群的搭建概述(非教程)
  8. SmartBinding与kbmMW#3
  9. odoo xml中添加数据的数字代表含义
  10. c++ mfc和win32项目