1 5 10 3 5 1 4 2 5 1 2 3 4 1 4 2 3 1 5 3 5 1 2
1 2 3 4 5
参考了别人的代码.之前交了个字典序优先的,,, 我还是图森破了啊...
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
int main()
{
int t,n,m,u,v,i,tem;
vector<int>res;
int in[30010],vis[30010];
vector<int>edge[30010];
priority_queue<int>q;
scanf("%d",&t);
while(t--)
{
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));
res.clear();
while(!q.empty())
q.pop();
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
edge[i].clear();
}
while(m--)
{
scanf("%d%d",&u,&v);
in[u]++;
edge[v].push_back(u);//u必在v前 反拓扑排序 v在u前面.
}
for(i=1;i<=n;i++)
{
if(in[i]==0)
q.push(i);//如果没有数是要在他们之前输出的, 就入队, 因为是反拓扑排序, 优先大的出队.进入res来输出
}
while(!q.empty())
{
tem=q.top();
q.pop();
res.push_back(tem);
for(i=edge[tem].size()-1;i>=0;i--)//优先满足需要的 v在u前面.
{
u=edge[tem][i];
in[u]--;
if(in[u]==0)
q.push(u);
}
}
for(i=res.size()-1;i>=0;i--)
{
if(i==res.size()-1)
printf("%d",res[i]);
else
printf(" %d",res[i]);// 输入有 5 3 和 5 4 ; 4的时候in[4]减后为1; 到3才轮到5入队
}
puts("");
}
return 0;
}hdu4857 逃生 反拓扑排序+优先队列, 靠前的数字的优先输出.,布布扣,bubuko.com
hdu4857 逃生 反拓扑排序+优先队列, 靠前的数字的优先输出.
原文地址:http://blog.csdn.net/u013532224/article/details/38168643