按照定义来求即可:
实数空间可由绝对值“|·|”诱导产生拓扑τ={R中的全体开区间}(当然包括空集),子集Z={全体整数},那么τ_Z={U∩Z|U∈τ}=2^Z(Z的幂集,即Z的子集的全体)为所求的子空间拓扑。
开集的定义是集合A中的每一个点都是内点,对于有理数集Q,任取Q中一点r,由于有理数和无理数在R上都是稠密的,所以不可能找到r的一个邻域(a,b),使得在(a,b)内的任意点都属于Q(就是说一个有理数的任何邻域内都存在无理数),r不是内点,所以Q不是开集。对于闭集,通常有不同的定义,一个等价的定义是,集合A满足条件A‘包含于A,这里A’表示A的所有极限点构成的集合,称为A的导集,来看有理数集Q,从Q中取一系列数r1,r2...rn,这个有理数序列{rn}的极限不一定是有理数(事实上我们就是借助有理数序列来定义无理数的),例如有理数序列1,1,4,1.41,1.414...的极限是无理数√2,因此Q‘是不可能包含于Q的。所以Q也不是闭集。有不明白的地方欢迎追问。程序运行结果:
1-3->2->4->5
对应楼主的图数据为:
5 7
1 2
1 4
1 3
2 4
3 4
4 5
2 5
代码:
#include <cstdio>int next[100],first[100],en[100],ru[100],n,m,dl[100],head=0,tail=0
int main()
{
freopen("t2.in","r",stdin)
scanf("%d%d",&n,&m)//读入顶点数和边数
for (int i=1i<mi++)//读入有向边
{
int x,y
scanf("%d%d",&x,&y)
next[i]=first[x]
first[x]=i
en[i]=y
ru[y]++
}
//用队列来进行拓扑排序
for (int i=1i<=ni++)//找到入度为0的点入队
if (ru[i]==0)
{
ru[i]==-1//将这个点去掉。
dl[++tail]=i//入队
}
while (head<tail)
{
int x=dl[++head]
int p=first[x]
while (p!=0)//和这个点相连的边删去
{
int y=en[p]
ru[y]--//则对应的点的入度会减少
if (ru[y]==0)//如果再次找到了入度为0的点则入队
{
ru[y]=-1
dl[++tail]=y
}
p=next[p]
}
}
//最后直接输出整个队列元素,从1到尾
int flag=0
for (int i=1i<=taili++)
if (!flag)
{
flag=1
printf("%d",dl[i])
}else printf("->%d",dl[i])
printf("\n")
return 0
}