题目:点击打开链接
分析:简单拓扑排序,数据少的情况下可以用二维数组,数据比较多的时候用邻接表或优先队列。代码一:二维数组 代码二:邻接表 代码三:如何构建邻接表代码四:优先队列。
代码一:
#include<stdio.h>
#include<string.h>
int queue[510],indegree[510];
int map[510][510];
int n,m;
void tuopo()
{
int i;
int j,k,t=0;
for(j=0;j<n;j++)
{
for(i=1;i<=n;i++)
{
if(indegree[i]==0)
{
k=i;
indegree[i]=-1;
break;
}
}
queue[t++]=k;
for(i=1;i<=n;i++)
{
if(map[k][i])
indegree[i]--;
}
}
printf("%d",queue[0]);
for(i=1;i<n;i++)
printf(" %d",queue[i]);
printf("\n");
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int j;
int a,b;
memset(queue,0,sizeof(queue));
memset(indegree,0,sizeof(indegree));
memset(map,0,sizeof(map));
for(j=1;j<=m;j++)
{
scanf("%d%d",&a,&b);
if(map[a][b]==0)
{
map[a][b]=1;
indegree[b]++;
}
}
tuopo();
}
return 0;
}
代码二:
#include<stdio.h>
#include<string.h>
int n,m;
int indegree[51000],queue[51000];
struct stu
{
int to;
int next;
}a1[51000];
int head[51000];
void topo()
{
int top,t=0;
for(int i=0;i<n;i++)
{
for(int j=1;j<=n;j++)
{
if(indegree[j]==0)
{
top=j;
indegree[j]=-1;
break;
}
}
queue[t++]=top;
for(top=head[top];top!=-1;top=a1[top].next)
{
indegree[a1[top].to]--;
}
}
printf("%d",queue[0]);
for(int i=1;i<n;i++)
printf(" %d",queue[i]);
printf("\n");
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int i;
int a,b;
memset(indegree,0,sizeof(indegree));
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
a1[i].to=b;
a1[i].next=head[a];
head[a]=i;
indegree[b]++;
}
topo();
}
return 0;
}
代码三:
#include<stdio.h>
#include<string.h>
int head[100100],cnt;//head表头
struct s
{
int u,v,w;
int next;//后继
}edge[100010];
void add(int u,int v,int w)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i;
cnt=0;
memset(head,-1,sizeof(head));
for(i=0;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);//
add(u,v,w);
}
int u;
scanf("%d",&u);//查找u节点的邻接点
for(i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
int w=edge[i].w;
printf("%d%d",v,w);
}
}
return 0;
}
代码四:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<functional>
using namespace std;
int map[510][510];
int indegree[510];
void topo(int n)
{
priority_queue<int,vector<int>,greater<int> >Q;
int i,j,m,t=0;
for(i=1;i<=n;++i){
if(indegree[i]==0){
Q.push(i);
}
}
int sign=1;
while(!Q.empty()){
int top=Q.top();Q.pop();
indegree[top]=-1;
if(sign)
printf("%d",top);
else
printf(" %d",top);
sign=0;
for(i=1;i<=n;++i){
if(map[top][i]){
indegree[i]--;
if(indegree[i]==0){
Q.push(i);
}
}
}
}
printf("\n");
}
int main()
{
int n,m,i,j,a,b;
while(scanf("%d%d",&n,&m)!=EOF){
memset(indegree,0,sizeof(indegree));
memset(map,0,sizeof(map));
for(i=0;i<m;++i){
scanf("%d%d",&a,&b);
if(map[a][b]==0){
map[a][b]=1;indegree[b]++;
}
}
topo(n);
}
return 0;
}