您的位置:首页 > 其它

uva 200 Rare Order (拓扑排序)

2013-08-18 22:42 381 查看
uva 200 - Rare Order (拓扑排序)

先求出大小关系的邻接矩阵,然后拓扑排序

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <queue>
#include <algorithm>
using namespace std;

int a[30][30],degree[30];
vector <int> ans;

void input(){
	int s=1,d=0;
	string st;
	vector <string> v;
	set <int> mys;
	set <int>::iterator it;
	while(cin>>st && st!="#"){
		for(int i=0;i<st.length();i++) mys.insert(st[i]-'A');
		st="A"+st;
		d=d>=st.length()?d:st.length();
		v.push_back(st);
	}
	while(s<d){
		for(int i=0;i<v.size();i++){
			if(i>=v.size()-1 || v[i].length()<=s || v[i+1].length()<=s ) continue;
			string subst1=v[i].substr(0,s),subst2=v[i+1].substr(0,s);
			if(subst1==subst2 && v[i][s]!=v[i+1][s]){
				a[v[i][s]-'A'][v[i+1][s]-'A']=1;
			}
		}
		s++;
	}
	for(it=mys.begin();it!=mys.end();it++) ans.push_back(*it);
}

void getdegree(){
	for(int i=0;i<ans.size();i++){
		for(int j=0;j<ans.size();j++){
			if(a[ans[i]][ans[j]]>0) degree[ans[j]]++;
		}
	}
}

void topsort(){
	char s;
	queue <int> q;
	for(int i=0;i<ans.size();i++){
		if(degree[ans[i]]==0){
			q.push(ans[i]);
		}
	}
	while(!q.empty()){
		s='A'+q.front();
		q.pop();
		cout<<s;
		for(int i=0;i<ans.size();i++){
			if(a[s-'A'][ans[i]]>0){
				degree[ans[i]]--;
				if(degree[ans[i]]==0){
					q.push(ans[i]);
				}
			}
		}
	}
	cout<<endl;
}

int main(){
	input();
	getdegree();
	topsort();
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: