hdu1285
数据结构:
vector<vector<int> >G;//存储图;
int cnt_in[n];//定点n的入度;
用队列作为入度尾0的容器;
priority_queue<int,vector<int>,greater<int> >q;//定义小的先出队
算法思想:
对于一个入度为0的点,遍历他的后继,将后继的入度数减一即可,若出现入度为0则进队列;
重复直到输出所有点,如果有元素没出队列,则有环;
/**hdu1285**/
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
vector<vector<int> >G;
int cnt_in[510];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
memset(cnt_in,0,sizeof(cnt_in));
G.clear();
G.resize(n+10);
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
G[v].push_back(u);
G[u].push_back(v);
cnt_in[v]++;
}
priority_queue<int,vector<int>,greater<int> >q;//定义小的先出队
for(int i=1;i<=n;i++)if(cnt_in[i]==0)q.push(i);
bool flag=true;
while(!q.empty()){
int u=q.top();
q.pop();
if(flag){printf("%d",u);flag=false;}
else printf(" %d",u);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(--cnt_in[v]==0)q.push(v);
}
}
printf("\n");
}
return 0;
}