题目:openjudge 4865
http://jmusoft.openjudge.cn/beida/08/
-
总时间限制:
- 10000ms 内存限制:
- 1000kB
-
描述
-
给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前
输入
- 若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号 输出
- 若干个空格隔开的顶点构成的序列(用小写字母) 样例输入
-
6 8 1 2 1 3 1 4 3 2 3 5 4 5 6 4 6 5
样例输出
-
v1 v3 v2 v6 v4 v5
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef struct node{
int num;
node *ne;
} node;
int main(){
int v,a,f,t;
cin>>v>>a;
vector<node> graph(v+1);
for(int i=1;i<=v;i++)
graph[i]=node{0,NULL};
//graph存储每个节点的入度,邻接表存储边
while(a--){
cin>>f>>t;
node *p=new node;
if(graph[f].ne==NULL){
p->num=t;
p->ne=NULL;
graph[f].ne=p;
graph[t].num++;
}else{
p->num=t;
p->ne=graph[f].ne;
graph[f].ne=p;
graph[t].num++;
}
}
t=v;
while(t){
for(int i=1;i<=v;i++){
if(!graph[i].num){
cout<<"v"<<i<<" ";
node *p=graph[i].ne;
while(p!=NULL){
graph[p->num].num--;
p=p->ne;
}
graph[i].num=-1;
t--;
break;
}
}
}
return 0;
}