HDU-1285【拓补排序】
自己学到拓补排序找到这个题目,看着挺简单,其实有一些坑点,结果wrong了很多次,不过还好最终做了出来。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int n,m; int graph[550][550]; int value[550]; int indegree[550]; void tuobu() { int Count=0; int cnt=0; while(Count<n) { for (int i=1;i<=n;++i) { if (value[i]==0&&graph[i][i]==0) { Count++; indegree[cnt++]=i; graph[i][i]=1; for (int j=1; j<=n; ++j) { if (graph[i][j]==1&&i!=j&&graph[j][j]==0) { if (value[j]>0) --value[j]; } } break;//这里的break,加入的目的就是保证它能按规定要求顺序输入 } } } for (int i=0;i<n-1;++i) { printf("%d ",indegree[i]); } printf("%d\n",indegree[n-1]); } int main() { while(cin>>n>>m) { int num1,num2; memset(value,0,sizeof(int)*(n+1)); memset(graph,0,sizeof(graph)); memset(indegree,0,sizeof(indegree)); while(m--) { scanf("%d %d",&num1,&num2); if (!graph[num1][num2])//咳咳,看了这个判断就知道数据的坑点在哪了吧。。。。。就是这被坑大了 { graph[num1][num2]=1; graph[num1][num1]=0; graph[num2][num2]=0; value[num2]++; } } tuobu(); } }