您的位置:首页 > 其它

pku 1270 Following Orders(拓扑排序)

2009-10-29 12:30 260 查看
 单纯从复杂度来讲的话,我的算法的效率是n^26,是完全没办法接受的。但因为题目已经告诉我们最后满足条件的序列最多只有300个,所以稍微弄点剪枝,就可以省很多时间了。0ms过的。

#include <vector>
#include <iostream>
using namespace std;
int degree[26],count,ans[20];
bool used[26];
vector<int> edges[26];
char str[1000];
bool input()
{
memset(used,1,sizeof(used));
memset(degree,0,sizeof(degree));
for(int i=0;i<26;i++) edges[i].clear();
count=0;
if(cin.getline(str,1000)==0) return false;
int index=0;
while(1)
{
used[str[index]-'a']=false;
count++;
if(str[index+1]==0) break;
index+=2;
}
cin.getline(str,1000);
index=0;
while(1)
{
edges[str[index]-'a'].push_back(str[index+2]-'a');
degree[str[index+2]-'a']++;
if(str[index+3]==0) break;
index+=4;
}
return true;
}
void DFS(int n)
{
if(n==count)
{
for(int i=0;i<n;i++)
printf("%c",'a'+ans[i]);
printf("/n");
}
else
{
for(int i=0;i<26;i++)
{
if(!used[i]&°ree[i]==0)
{
for(int j=0;j<edges[i].size();j++) degree[edges[i][j]]--;
used[i]=true;
ans
=i;
DFS(n+1);
for(int j=0;j<edges[i].size();j++) degree[edges[i][j]]++;
used[i]=false;
}
}
}
}
int main()
{
while(input())
{
DFS(0);
printf("/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  input vector 算法 ini c