题目链接
简单的队列
#include<stdio.h>
#include<cstring>
#include<queue>
using namespace std;
const int Max=101;
//队列也是可以的
int Map[Max][Max];
int in_degree[Max];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
memset(Map,0,sizeof(Map));
memset(in_degree,0,sizeof(in_degree));
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(Map[a][b]==0)
in_degree[b]++;
Map[a][b]=1;//这句话要写在后面
}
queue<int> pq;
for(int i=1;i<=n;i++)
{
if(in_degree[i]==0)
pq.push(i);
}
while(pq.size())
{
int temp=pq.front();
for(int i=1;i<=n;i++)
{
if(Map[temp][i])//所有邻边的入度减一
{
in_degree[i]--;
//如果入度为0的话,我们就把他们放到优先队列中
if(in_degree[i]==0)
pq.push(i);
//不能把这个语句放在外面啊,因为入度有很多是0的,然而我们也会把它放进来
//我们只需要之前有入度,现在没有了的,所以之前有边的条件是钥匙
}
Map[temp][i]=0;//去掉所有的邻边
}
if(pq.size()==1)
printf("%d\n",temp);
else
printf("%d ",temp);
pq.pop();//最后把它扔了,要不然不好写输出
}
}
return 0;
}
无聊的我,让它按照大小输出
#include<stdio.h>
#include<cstring>
#include<queue>
using namespace std;
const int Max=101;
//队列也是可以的,只不过我想让它按照顺序输出,毕竟杂乱无章还是不太好看的
int Map[Max][Max];
int in_degree[Max];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
memset(Map,0,sizeof(Map));
memset(in_degree,0,sizeof(in_degree));
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(Map[a][b]==0)
in_degree[b]++;
Map[a][b]=1;//这句话要写在后面
}
priority_queue<int,vector<int>,greater<int> > pq;
for(int i=1;i<=n;i++)
{
if(in_degree[i]==0)
pq.push(i);
}
int W=1;
while(pq.size())
{
int temp=pq.top();
pq.pop();
for(int i=1;i<=n;i++)
{
if(Map[temp][i])//所有邻边的入度减一
{
in_degree[i]--;
if(in_degree[i]==0)//如果入度为0的话,我们就把他们放到优先队列中
pq.push(i);//不能把这个语句放在外面啊,因为入度有很多是0的,然而我们也会把它放进来
//我们只需要之前有入度,现在没有了的,所以之前有边的条件是钥匙
}
Map[temp][i]=0;//去掉所有的邻边
}
if(W==1)
printf("%d",temp);
else
printf(" %d",temp);
W=0;
}
printf("\n");
}
return 0;
}