标签:
/*hdu1285--采用二维数组记录两者之间的关系*/ #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; int map[510][510];//前驱数量 int indegree[510]; int queue[510];//保存拓扑序列 void topo(int n) { int i,j,m,t=0; for(j=1;j<=n;j++) { for(i=1;i<=n;i++) { if(indegree[i]==0) //找出前驱数量为零的的点即每次找到第一名 { m=i;break; } } queue[t++]=m;indegree[m]=-1;//将第一名的前驱数量设为-1 for(i=1;i<=n;++i)//第二步将前驱中含有第一名的点前驱数量减1 { if(map[m][i])indegree[i]--; } } printf("%d",queue[0]);//输出拓扑序列 for(i=1;i<n;++i) { printf(" %d",queue[i]); } printf("\n"); } int main() { int n,m,i,j,a,b; while(scanf("%d%d",&n,&m)!=EOF) { memset(indegree,0,sizeof(indegree));//初始化 memset(map,0,sizeof(map)); for(i=0;i<m;++i) { scanf("%d%d",&a,&b); if(map[a][b]==0)//避免重复的数据输入 { map[a][b]=1;indegree[b]++;//第一步记录关系和点的前驱数量 } } topo(n);//调用拓扑排序 } return 0; } /*hdu1285--采用邻接表记录两者之间的关系*/ #include<cstdio> #include<cstring> int head[510]; int indegree[510]; int queue[510]; int num; struct stu{ int to,next; }edge[2510]; void inin(){//初始化 memset(indegree,0,sizeof(indegree)); memset(head,-1,sizeof(head)); num=0; } void add(int a,int b){//添加边 stu E={b,head[a]}; edge[num]=E; head[a]=num++; indegree[b]++; } void topo(int n){ int i,j,id,t=0; for(j=1;j<=n;j++){ for(i=1;i<=n;i++){ if(indegree[i]==0){ id=i; break; } } queue[t++]=id;indegree[id]=-1; for(i=head[id];i!=-1;i=edge[i].next){ int k=edge[i].to; indegree[k]--; } } printf("%d",queue[0]);//输出拓扑序列 for(i=1;i<n;++i){ printf(" %d",queue[i]); } printf("\n"); } int main(){ int n,m,i,j,a,b; while(scanf("%d%d",&n,&m)!=EOF){ inin(); for(i=1;i<=m;i++){ scanf("%d%d",&a,&b); add(a,b); } topo(n); } return 0; } #include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #include <functional> using namespace std; int map[510][510]; int indegree[510]; void topo(int n) { int i,j,m,t=0; priority_queue<int,vector<int>,greater<int> >Q;//按从小到大顺序输出队 for(i=1;i<=n;i++){ if(indegree[i]==0){ Q.push(i); } } int sign=1; while(!Q.empty()){ int top=Q.top(); Q.pop(); indegree[top]=-1; if(sign) printf("%d",top); else printf(" %d",top); sign=0; for(i=1;i<=n;i++){ if(map[top][i]){ indegree[i]--; if(indegree[i]==0){ Q.push(i); } } } } printf("\n"); } int main() { int n,m,i,j,a,b; while(scanf("%d%d",&n,&m)!=EOF){ memset(indegree,0,sizeof(indegree)); memset(map,0,sizeof(map)); for(i=0;i<m;++i){ scanf("%d%d",&a,&b); if(map[a][b]==0){ map[a][b]=1;indegree[b]++; } } topo(n); } return 0; }
标签:
原文地址:http://www.cnblogs.com/llal/p/5740730.html