如題所示:
//算法求解:求拓撲排序的問題 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<stack> using namespace std; #define N 100 vector<int> E[N];//N個節點打頭的鄰接表 int degree[N]; int main(){ FILE *fp1,*fp2; stack<int> q; fp1=fopen("3.in","r"); fp2=fopen("3.out","w"); int count=0;//統計總任務數 for(int i=0;i<N;i++){degree[i]=0;//初始化所有節點的度數均是0 E[i].clear();//清空鄰接鏈表*****遺漏點 } while(!q.empty())q.pop();//清空棧中的信息****遺漏點 while(!feof(fp1)){ char s[N]; int k=0; fgets(s,99,fp1); int sign=1; int temp; while(s[k]!='\0'){//將頂點信息輸入鄰接表中,同時更新度數 if(s[k]>='0'&&s[k]<='9'&&sign==1){ temp=s[k]-'0'; sign=0; count++; k++; } else if(s[k]>='0'&&s[k]<='9'&&sign==0){ int h=s[k]-'0'; E[temp].push_back(h);//***錯誤點 degree[h]++;//h結點入度加一 k++; } else{k++;} } } for(i=0;i<count;i++){ if(degree[i]==0)q.push(i); } while(!q.empty()){ int m=q.top(); fprintf(fp2,"Task%d ",m); q.pop(); for(i=0;i<E[m].size();i++){//注:vector是用size+for循環並不能用empty因爲其無pop函數 degree[E[m][i]]--; if(degree[E[m][i]]==0)q.push(E[m][i]); } } return 0; }