POJ1270 toposort+DFS+回溯
2024-09-01 16:18:58
题目链接:http://poj.org/problem?id=1270
这道题其实就是求所有满足条件的topo序,我们考虑到给定的字符是确定的,也就是他们的长度都是一样的,所以为了得到所有的情况,我们可以考虑深度优先搜素和dfs解答树上的回溯。首先,我们从任何一个入度为0的点开始dfs,将这个点的入度-1,防止下一层的搜索中搜到这个点,再更新所有这个点可到达的点的入度,完成这些状态更新之后dfs解答树进入下一层搜索,直到深度值等于串长,输出topo序。回溯的过程中我们需要将之前修改的所有的状态都修改回来。读入的时候要考虑到一次性读入一行,然后进行空格的处理。
代码如下:
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
const int maxn=;
int n,m,t;
int vis[maxn],in[maxn],e[maxn][maxn];
char s[],h[maxn],ans[maxn];
int cnt;
void init()
{
memset(vis,,sizeof(vis));
memset(in,,sizeof(vis));
memset(ans,,sizeof(ans));
memset(e,,sizeof(e));
}
void toposort(int dep)
{
if(dep==cnt)
{
printf("%s\n",ans);
return ;
}
for(int i=;i<cnt;i++)
{
if(in[i]==&&!vis[i])//只要找到入度为0而且不在topo序中的点就开始搜索,至于回溯和标记则是在递归中进行
{
vis[i]=;
ans[dep]=h[i];
for(int j=;j<cnt;j++)
if(e[i][j])in[j]--;
toposort(dep+);
vis[i]=;
for(int j=;j<cnt;j++)
if(e[i][j])in[j]++;//回溯过程
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
//std::ios::sync_with_stdio(false);
while(gets(s))//一次性读取一行字符串在处理
{
cnt=;
int len=strlen(s);
map<char ,int > mp;
init();
for(int i=;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')//读掉空格
{
h[cnt++]=s[i];
}
}
sort(h,h+cnt);//为了保证最终的topo序是按照字典序输出的,需要给字符集排个序,这样搜索将会变得有序
for(int i=;i<cnt;i++)
{
mp[h[i]]=i;//将字符集转化成整数集
}
gets(s);
len=strlen(s);
int tmp1,tmp2;
bool flag=;//由于是成对出现的,通过对flag的翻转可以确认目前得到的是成对的第一个数还是第二个数
for(int i=;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')
{
if(!flag)
{
flag=;
tmp1=mp[s[i]];//得到的是成对中的第一个数,并获取编号
}
else
{
tmp2=mp[s[i]];
flag=;
e[tmp1][tmp2]=;
in[tmp2]+=;
}
}
}
toposort();
printf("\n");//注意每个结果之后有一个空行
}
}
最新文章
- SQLyog图形化l数据库的操作和学习
- 深入.NET平台的软件系统分成开发(1/6)
- 【BZOJ】3309: DZY Loves Math
- php 生成 Json
- x-forwarded-for的深度挖掘
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
- WinDBG使用之线程
- [OFBiz]开发 一
- [CODEVS1014]装箱问题
- C# 向批处理文件输入字符
- 一个好用的hash函数(C语言)
- PHP进口Excel至MySQL方法
- perl版 Webshell存活检测
- java 需要准备的知识(转摘)
- 初识WCF之使用配置文件部署WCF应用程序
- ISLR系列:(4.3)模型选择 PCR &; PLS
- Java 基本文件操作
- Python学习的相关文件链接
- MATLAB——神经网络init初始化函数和adapt函数
- VPS常用操作(自用)