poj 1270 Following Orders(DFS+拓扑排序)

题目:http://poj.org/problem?id=1270

描述:给定几个字母,然后给定几个约束关系,然后打印出满足所有约束关系的字符串

输入:

              a b f g

              a b b f (满足的约束关系A<B,即a在b前面;b<f,即b在f前面)

              v w x y z

              v y x v z v w v(满足的约束关系v<y,即v在y前面;x<v,即z在v前面,依次类推....)

输出:

            abfg
       abgf
       agbf
       gabf

       wxzvy
       wzxvy
       xwzvy
       xzwvy
          zwxvy
       zxwvy

 

 

思想:DFS+拓扑排序

 

代码:

#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
using namespace std;

#define  MAX_VERTEX 21

int edge[MAX_VERTEX][MAX_VERTEX];//保存边信息
int indegree[MAX_VERTEX];//入度信息
char s1[50];//输入顶点
char s2[50];//输入边
char ans[50];//保存结果

char ver[50];//存储边的信息
map<char,int>list;
int numVer;//顶点数

void dfs(int k)
{
	if(k==numVer){
		printf("%s\n",ans);
		return;
	}
	for(int i=0;i<numVer;i++){
		if(indegree[i]==0){
			ans[k] = ver[i];
			indegree[i]--;
			for(int j=0;j<numVer;j++){
				if(edge[i][j])indegree[j]--;	
			}
			dfs(k+1);
			indegree[i]++;
			for(int j=0;j<numVer;j++){
				if(edge[i][j])indegree[j]++;	
			}
		}
	}
}

int main()
{
	int i,j;
	bool flag=false;
	while(gets(s1)){
		int cnt = 0;
		for(i=0;s1[i]!='\0';i++){
			if(islower(s1[i])){
				ver[cnt++] = s1[i];
			}
		}
        
		sort(ver,ver+cnt);

		for(i=0;i<cnt;i++)
			list.insert(make_pair(ver[i],i));

		numVer = cnt;
		for(i=0;i<cnt;i++){
			indegree[i] = 0;
			ans[i] = '\0';
			for(j=0;j<cnt;j++)
				edge[i][j] = 0;
		}
        gets(s2);

		for(i=0;s2[i]!='\0';i++){
			if(islower(s2[i])){
				int start = i++;
				while(!islower(s2[i]))i++;
				//cout<<s2[start]<<","<<s2[i]<<endl;
				edge[list[s2[start]]][list[s2[i]]] = 1;
				indegree[list[s2[i]]]++;
			}
		}
		dfs(0);
        printf("\n");
	}
	system("pause");
	return 0;
}


 

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值