//edited by Eddy
//from BUAA SoftWare College
//any question:oeddyo@gmail.com
//先建图,DFS找F[U],再把F[U]从大到小排序即可
#define MAX 105
#define NIL 1000000
#include <algorithm>
#include <iostream>
using namespace std;
typedef struct edge
{
int adjvex;
struct edge *next;
}ELink;
typedef struct ver
{
int number; //存入度
int vertex; //顶点信息
struct edge *link;
bool flag;
}VLink;
int mytime;
VLink G[MAX]; //G作为全局,免去过多参数传递
int color[MAX];
int f[MAX];
int a[MAX];
void Creat(int N) //n为顶点数,e为边数
{
for(int k=1;k<=N;k++) //注意,0没有用
{
G[k].vertex=k;
G[k].link=NULL;
}
for(int i=1;i<=N;i++)
{
int j=0;
int temp;
cin>>temp;
while(temp!=0)
{
a[j++]=temp;
cin>>temp;
}
int k,vi,vj,weight;
ELink *p,*q;
for(k=0;k<j;k++)
{
int temp=a[k];
G[a[k]].number++;
p=new ELink;
p->adjvex=temp;
p->next=NULL;
if(!G[i].link)
{
G[i].link=p;
}
else
{
q=G[i].link;
while(q->next)
{
q=q->next;
}
q->next=p;
}
G[i].flag=0; //未被删
}
}
}
void TopSort(int N)
{
int remains=N;
while(remains>0)
{
for(int i=1;i<=N;i++)
{
if(G[i].flag==1)
continue;
if(G[i].number==0) //入度为0,删掉
{
G[i].flag=1;
ELink *p=G[i].link;
while(p)
{
G[p->adjvex].number--;
p=p->next;
}
remains--;
if(remains>0)
cout<<G[i].vertex<<" ";
else
cout<<G[i].vertex<<endl;
}
}
}
}
int main()
{
int N; //1~100
cin>>N;
Creat(N);
TopSort(N);return 0;
}
没啥多说的,裸拓排
用了算导上的求f[u]的算法
以下是AC代码:
用删除入度为0的方法做了次,时间短了一半。
//edited by Eddy
//from BUAA SoftWare College
//any question:oeddyo@gmail.com
#define MAX 105
#define NIL 1000000
#include <algorithm>
#include <iostream>
using namespace std;
typedef struct edge
{
int adjvex;
int weight;
struct edge *next;
}ELink;
typedef struct ver
{
int vertex; //顶点信息
struct edge *link;
}VLink;
int mytime;
VLink G[MAX]; //G作为全局,免去过多参数传递
int color[MAX];
int f[MAX];
int a[MAX];
void Creat(int N) //n为顶点数,e为边数
{
for(int k=1;k<=N;k++) //注意,0没有用
{
G[k].vertex=k;
G[k].link=NULL;
}
for(int i=1;i<=N;i++)
{
int j=0;
int temp;
cin>>temp;
while(temp!=0)
{
a[j++]=temp;
cin>>temp;
}
int k,vi,vj,weight;
ELink *p,*q;
for(k=0;k<j;k++)
{
int temp=a[k];
p=new ELink;
p->adjvex=temp;
p->next=NULL;
if(!G[i].link)
{
G[i].link=p;
}
else
{
q=G[i].link;
while(q->next)
{
q=q->next;
}
q->next=p;
}
}
}
}
void DFS_visit(int u)
{
color[u]=2;
mytime++;
ELink *p;
p=G[u].link;
int v=0;
while(p)
{
v++;
if(color[G[p->adjvex].vertex]==1)
{
DFS_visit(p->adjvex);
}
p=p->next;
}
color[u]=3;
f[u]=++mytime;
}
void DFS(int N) //N为顶点数
{
for(int i=1;i<=N;i++)
{
color[i]=1; //1:white 2:grey 3:black
}
mytime=0;
for(int i=1;i<=N;i++)
{
if(color[i]==1)
{
DFS_visit(i);
}
}
}
void mysort(int N)
{
int i,j,flag=1;
for(i=1;i<=N;i++)
{
a[i]=i;
}
int temp;
i=N-1;
while(i>0&&flag==1)
{
flag=0;
for(j=1;j<=i;j++)
{
if(f[j]<f[j+1])
{
temp=f[j];
f[j]=f[j+1];
f[j+1]=temp;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1;
}
}
i--;
}
}
int main()
{
int N; //1~100
cin>>N;
Creat(N);
DFS(N);
mysort(N);
for(int i=1;i<=N;i++)
{
if(i!=N)
{
cout<<a[i]<<" ";
}
else{
cout<<a[i]<<endl;
}
}
return 0;
}