这是一道最简单的拓扑排序题,好久没看这个算法了!

有点生疏了!

后附上百度的资料;

#include<stdio.h>

#include<string.h>

int in[5000];

char map[3000][3000];

int n;

int panduan()

{


int i,j,k;


for(i=0;i<n;i++)


for(j=0;j<n;j++)


if(map[i][j]=='1')


in[j]++;


for(i=0;i<n;i++)


{


j=0;


while(in[j]!=0)


j++;


if(j==n)


return 0;


else


{


in[j]--;


for(k=0;k<n;k++)


if(map[j][k]=='1')


in[k]--;


}


}


return 1;

}

int main()

{


int t,i,r;


scanf("%d",&t);


r=1;


while(t--)


{


scanf("%d",&n);


memset(in,0,sizeof(in));


getchar();


for(i=0;i<n;i++)


{


scanf("%s",map[i]);


}


printf("Case #%d: ",r++);


if(panduan())


printf("No\n");


else


printf("Yes\n");


}


return 0;

}

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4324

拓扑排序

什么是拓扑序列

通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个
偏序得到该集合上的一个
全序,这个操作称之为拓扑排序。离散数学中关于
偏序
全序的定义:
若集合X上的关系是R,且R是自反的、反对称的和传递的,则称R是集合X上的
偏序关系
设R是集合X上的偏序(Partial Order),如果对每个x,y属于X必有xRy 或 yRx,则称R是集合X上的
全序关系
比较简单的理解:偏序是指集合中只有部分成员可以比较,全序是指集合中所有的成员之间均可以比较。
注意:
①若将图中顶点按拓扑次序排成一行,则图中所有的有向边均是从左指向右的。
②若图中存在有向环,则不可能使顶点满足拓扑次序。
③一个DAG的拓扑序列通常表示某种方案切实可行。
一般应用:
拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。例如,在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列,则排在前面的任务就是需要先完成的任务。

实现的基本方法

拓扑排序方法如下:
(1)从
有向图中选择一个没有前驱(即
入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.

编辑本段拓扑序列 Pascal代码

在计算机语言中的应用:

program TopSort;

var
map,link:array [1..100,1..100] of integer;
v,pnt:array [1..100] of integer;
n,m,a,b,i,j,k:integer;
begin
fillchar(map,sizeof(map),0);
fillchar(link,sizeof(link),0);
fillchar(v,sizeof(v),0);
readln(n,m);
for i:=1 to m do
begin
readln(a,b);
map[a,b]:=1;
v[b]:=v[b]+1;
end;
i:=0;
link:=map;
while (i<n) do
begin
j:=1;
while (v[j]<>0) do inc(j);
v[j]:=-1;
for k:=1 to n do
if link[j,k]=1 then begin dec(v[k]);link[j,k]:=0; end;
inc(i);
pnt[i]:=j;
end;
for i:=1 to n do
writeln(pnt[i]);
end.

拓扑序列 C++核心代码

bool TopologicalSort(int a[][101]) //可以完成拓扑排序则返回True
{
int n = a[0][0], i, j;
int into[101], ans[101];
memset(into, 0, sizeof(into));
memset(ans, 0, sizeof(ans));
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (a[i][j] > 0)
into[j]++;
}
}
into[0] = 1;
for (i = 1; i <= n; i++)
{
j = 0;
while (into[j] != 0)
{
j++;
if (j > n)
return false;
}
ans[i] = j;
into[j] = -1;
for (int k = 1; k <= n; k++)
{
if (a[j][k] > 0)
into[k]--;
}
}
for (i = 1; i <= n; i++)
{
cout << ans[i] << " ";
}
cout << endl;
return true;
}

延伸 拓扑学

拓扑学是近代发展起来的一个研究连续性现象的数学分支。中文名称起源于希腊语Τοπολογία的音译。Topology原意为地貌,于19世纪中期由科学家引入,当时主要研究的是出于
数学分析的需要而产生的一些
几何问题。发展至今,
拓扑学主要研究
拓扑空间在拓扑变换下的不变性质和不变量。

hdu4324 Triangle LOVE (拓扑排序)的更多相关文章

  1. Triangle LOVE(拓扑排序)

    Triangle LOVE Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total ...

  2. HDU 4324 Triangle LOVE 拓扑排序

    Problem Description Recently, scientists find that there is love between any of two people. For exam ...

  3. HDU4324 Triangle LOVE【拓扑排序】

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  4. hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  5. HDU - 4324 Triangle LOVE(拓扑排序)

    https://vjudge.net/problem/HDU-4324 题意 每组数据一个n表示n个人,接下n*n的矩阵表示这些人之间的关系,输入一定满足若A不喜欢B则B一定喜欢A,且不会出现A和B相 ...

  6. HDU 4324 Triangle LOVE (拓扑排序)

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  7. HDU 4324 (拓扑排序) Triangle LOVE

    因为题目说了,两个人之间总有一个人喜欢另一个人,而且不会有两个人互相喜欢.所以只要所给的图中有一个环,那么一定存在一个三元环. 所以用拓扑排序判断一下图中是否有环就行了. #include <c ...

  8. hdu 4324 Triangle LOVE(拓扑排序,基础)

    题目 /***************************参考自****************************/ http://www.cnblogs.com/newpanderking ...

  9. hdu4324 拓扑排序

    #include<cstdio> #include<string.h> #define maxn 2013 char M[maxn][maxn]; int du[maxn]={ ...

随机推荐

  1. How to install PL/SQL developer on linux (转)

    PL/SQL developer 在linux上的安装方法工欲善其事必先利其器,PL/SQL和toad对于ORACLE从业人员来说都是很重要的工具,但这些工具都没有linux的发行版,如果要在linu ...

  2. java.lang.ClassFormatError

    Error occurred during initialization of VMjava.lang.ClassFormatError: Unknown constant tag 26 in cla ...

  3. Redis 的性能

    Redis 的性能幻想与残酷现实 2011 年,当初选择 Redis 作为主要的内存数据存储,主要吸引我的是它提供多样的基础数据结构可以很方便的实现业务需求.另一方面又比较担心它的性能是否足以支撑,毕 ...

  4. c++内存泄漏处理(积累)

    写c++程序时,常常会出现内存泄漏的问题,这里从网上找了一种非常麻烦的方法:假设想找到每一个cpp文件的内存泄漏,都必须在每一个cpp加上例如以下代码: #include <crtdbg.h&g ...

  5. ExtJS学习-----------Ext.Number,ExtJS对javascript中的Number的扩展

    关于ExtJS对javascript中的Number的扩展,能够參考其帮助文档,文档下载地址:http://download.csdn.net/detail/z1137730824/7748893 以 ...

  6. NavigationBar隐藏

    小编今天呢在搞 NavigationBar但是怎么弄都用不好,假设用navigationbar我往里面拖拽button.button的点击反应范围比較大,这样效果就不好. 突然看到有网友说能够将nav ...

  7. hdu 4691 最长的共同前缀 后缀数组 +lcp+rmq

    http://acm.hdu.edu.cn/showproblem.php? pid=4691 去年夏天,更多的学校的种族称号.当时,没有后缀数组 今天将是,事实上,自己的后缀阵列组合rmq或到,但是 ...

  8. 【转】Android内存机制分析1——了解Android堆和栈

    昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...

  9. mysql常见操作汇总

    1.Mysql服务突然启不来了,报错: 在分析时发现MySQL Server 5.0\data下面有个名称为用户名,扩展名为.err的文件: 150725 20:01:19 [Note] 自己的安装目 ...

  10. OCEANIAERP对接-code盘点机并存储实时库存计划和方案的使用,实时库存,云清查方案

    1.     PDA手持设备按键说明 [Tab]键:使输入焦点在控件上切换. [ESC]键:弹出是否退出确认对话框,退出操作界面或程序. [OK]键:确认输入或选择,进入下一步操作. [C]键:删除键 ...