拓扑排序是指:
-
一个二维数组或vector<int> edge[50]代表从E->A的边,方便消除E后寻找到A点;
-
int[50]数组装节点的入度多少
-
优先队列(平常从大到小,priority_queue<int,vector<int>,greater<int> > q,相反,从小到大)多用于字典序的排列
-
然后寻找入度为0的点,同时减少指向点的入度值(-1),判断(in[ ] == 0)入队和出队。(vector 装出队信息)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
vector<int>edge[30010],ans;
priority_queue<int>q;//从大到小
int in[30010];
int T,n,m;
void init()
{
for(int i=1;i<=n;i++)
{
edge[i].clear();
in[i]=0;
}
while(!q.empty())
{
q.pop();
}
ans.clear();
}
void solve()
{
int i,j;
for(i=1;i<=n;i++)
if(in[i]==0)
{
q.push(i);
}
while(!q.empty())
{
int p=q.top();
q.pop();
ans.push_back(p);
for( i=0; i<edge[p].size(); i++ )
{
int v=edge[p][i];
in[v]--;
if(in[v]==0)
{
q.push(v);
}
}
}
for(i=ans.size()-1;i>0;i--)
{
printf("%d ",ans[i]);//Presentation Error 输出错误 最后多输出了个空格
}
printf("%d\n",ans[0]);
}
int main()
{
int a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
while(m--)
{
scanf("%d%d",&a,&b);
edge[b].push_back(a);
in[a]++;
}
solve();
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf=1e9;
const int maxn=1e6+5;
vector<int>edge[50];//二维数组的使用;
int in[50];
int main()
{
char s[5];
set<int>k;
while(cin>>s)//E->A A->S S->Y
{
k.insert(s[2]-'A');//E 0 ; A 1 ; S 1 ; Y 1;
k.insert(s[0]-'A');
if(s[1]=='>')//E>A
{
in[s[2]-'A']++;//edge[E]=A; 从E到A的边
edge[s[0]-'A'].push_back(s[2]-'A');//边的连接;
}
else
{
in[s[0]-'A']++;
edge[s[2]-'A'].push_back(s[0]-'A');
}
}
//按字典序排序输出;
priority_queue<int,vector<int>,greater<int> >q;//从小到大的优先级队列,可将greater改为less,即为从大到小
//priority_queue<int> qi;//普通的优先级队列,按从大到小排序
for(int i=0;i<30;i++)
{
if(in[i]==0 && k.count(i)!=0)//用来查找set中某个某个键值出现的次数,这样就变成了判断某一键值是否在set出现过了
q.push(i);
}
vector<int>ans;
while(!q.empty())
{
int p=q.top();
q.pop();
ans.push_back(p);
for(int i=0;i<edge[p].size();i++)//点射到其他点的边数
{
int y=edge[p][i];
in[y]--;
if(in[y]==0) //&& k.count(y)!=0)
q.push(y);//按从小到大的字典序排序输出;
}
}
if(ans.size()==k.size())
{
for(int i=0;i<ans.size();i++)
printf("%c",ans[i]+'A');
printf("\n");
}
else printf("No Answer!\n");
return 0;
}