题目名字:Ordering Tasks
拓扑排序重要两点:
1.输出入度为0的点
2.将与该点相连的点的入度减一
1.过OJ的
//注释**********
x表示前面还有待排的数(不一定是数)的数量(可视为入度
然后排好序好 存入aa数组,最后输出y
疑惑::::下标和x,y的含义有点混
不太明白此结构体,感觉不像是个结构体。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,j,n) for(ll i=j;i<=n;i++)
ll n,m,aa[1010][1010];
struct node
{
ll x,y;
}q[1010];
int main()
{
while(cin>>n>>m&&n+m)
{
ll a,b;
memset(q,0,sizeof(q));
memset(aa,0,sizeof(aa));
rep(i,1,m)
{
cin>>a>>b;
if(aa[a][b]==0)
{
aa[a][b]=1;
q[b].x++;
}
}
ll k,l=0;
rep(i,1,n)
{
rep(j,1,n)
{
if(q[j].x==0)
{
k=j;
break;
}
}
q[l++].y=k;
q[k].x=-1;
rep(j,1,n)
{
if(aa[k][j]==1)
{
q[j].x--;
}
}
}
rep(i,0,l-2)
cout<<q[i].y<<" ";
cout<<q[l-1].y<<endl;
}
return 0;
}
2.没过OJ的
///注释******************
1.indegree【】记录点的入度
2.最终输出队列的内容
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,j,n) for(ll i=j;i<n;i++)
ll n,m,indegree[111];
queue<ll>q;
vector<ll>p[111];
void tpsort(){
while(!q.empty())
q.pop();
rep(i,1,n+1){
if(indegree[i]==0)
q.push(i);
}
ll cnt=0;
while(cnt<n){
ll t=q.front();
q.pop();
cnt++;
if(cnt==1)
cout<<t;
else
cout<<" "<<t;
rep(i,0,p[t].size()){
indegree[p[t][i]]--;
if(!indegree[p[t][i]])
q.push(p[t][i]);
}
}
}
int main(){
while(cin>>n>>m){
if(n==0&&m==0) break;
rep(i,0,n){
p[i].clear();
indegree[i]=0;
}
rep(i,0,m){
ll u,v;
cin>>u>>v;
indegree[v]++;
p[u].push_back(v);
}
tpsort();
cout<<endl;
}
}