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

有点生疏了!

后附上百度的资料;

#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. Linux常见命令整理(一)

    整理一下,以备后用 cd /home 进入/home文件夹 cd .. 返回上一级文件夹  cd ../.. 返回上两级文件夹  cd 进入个人的主文件夹  cd - 返回上次所在的文件夹 pwd 显 ...

  2. maven学习系列(一)—maven安装和基本设置

    maven下载和配置 第一步:下载apache-maven-2.3.2-bin.zip并解压到D:\tools,下载地址http://maven.apache.org/download.cgi 第二步 ...

  3. Winform WebBrowser引用IE版本问题

    做了一个Winform的项目.项目里使用了WebBrowser控件.以前一直都以为WebBrowser是直接调用的系统自带的IE,IE是呈现出什么样的页面WebBrowser就呈现出什么样的页面.其实 ...

  4. Python爬虫框架Scrapy获得定向打击批量招聘信息

    爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这样的说法不够专业,更专业的描写叙述就是.抓取特定站点网页的HTML数据.只是因为一个站点的网页非常多,而我们又不可能事先知道全部网页的URL地址, ...

  5. 【C语言探索之旅】 第二部分第四课:字符串

    内容简介 1.课程大纲 2.第二部分第四课: 字符串 3.第二部分第五课预告: 预处理 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...

  6. Hello ASP.NET5

    2015年11月30日, ASP.NET 5 RC1 已经发布,本文尝试了一下ASP.NET5项目的创见一发布到IIS.开发环境,win10 64位,visual studio2015(已更新upda ...

  7. Deploy Oracle 10.2.0.5 on Red Hat Enterprise Linux 6.4

    一.Linux系统安装和配置 1.安装系统时选Desktop 2.设置eth0网卡为静态IP,加入子网掩码,网关,DNS.并配置自己主动启动 3.改动/etc/hosts.加入主机名和相应IP 4.禁 ...

  8. 利用hibernate的session查询数据库,而且在jsp页面显示表内容的方法

    试过了非常多种方法都没有成功,最终让我找到了这样的方法! 首先在后台写代码: Transaction tx = session.beginTransaction(); List list = sess ...

  9. POJ2029——Get Many Persimmon Trees

    Get Many Persimmon Trees Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3656   Accepte ...

  10. Caused by: org.springframework.beans.factory.BeanCreationException

    1.错误原因 2014-7-13 17:36:57 org.apache.jasper.compiler.TldLocationsCache tldScanJar 信息: At least one J ...