随笔分类 - DFS算法
摘要:连通图Time Limit:1000MS Memory Limit:65536KTotal Submit:17 Accepted:4 Description Input 输入:每组数据的第一行是两个整数n 和m(0 < n <=100)。n 表示图的顶点 数目,0 < m <= 100 表示图中边的数目。如果n 为 0 表示输入结束。随后有m 行数据,每 行有两个值x 和y(0 < x , y <=n ),表示顶点x 和y 相连,顶点的编号从1 开始计 算。输入不保证这些边是否重复。 Output 输出:对于每组输入数据,如果所有从1~n所有顶点都是连通的,
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2553Nqueen问题#include"iostream"using namespace std;int n;int a[20];int b[20];int c;bool Panduan(int x){ for(int i=0; i<x; i++) { if( (a[x]-a[i])==0 || (abs(a[x]-a[i])-abs(x-i))==0 ) return false; //关键点 } return true;}void dfs(int y ,int z){ for(i
阅读全文
摘要:View Code #include"iostream"using namespace std;int a[1001],b[1001];int used[1001];int n;int i,j,q,t;void Init(){ for(i=1;i<40;i++) b[i]=1; for(i=2;i<40;i++) { for(j=2;j<40;j++) b[i*j]=0; }}void dfs(int x, int y){ if(y == n) { if( b[x+1] ) { a[n]=x; cout<<"1 "; for
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1159直接模板!View Code #include"iostream"using namespace std;char a[1001],b[1001];int c[1001][1001];int Max(int a, int b){ return a>b?a:b;}void LCS(char *aa , char *bb, int x, int y){ int i,j; for(i=0;i<=x;i++) c[i][0]=0; for(j=0;j<=y;j++) c[0
阅读全文
摘要:#include"iostream"using namespace std;char s[100];char S[100],E[100];int i=0,j;int used[1000];int sign=0,mark=0;void dfs(int x){ if(E[x]=='m') { cout<<"Yes."<<endl; sign=1; mark=1; } //sign标志已经找到尾“m”,mark表示找到'm'的情况:如果找到则mark=1,否则mark=0; else { for(int
阅读全文
摘要:借鉴别人的方法写了一下,收获挺大。题目分析:设树中任意结点为A,当结点A为终端结点,则只需要一个石子对其进行填充;当结点a为非终端结点时,需要的石子数则由其孩子结点而定。设结点A有k个孩子(A0,A1,...,Ak-1),每个孩子需要填充时需要ai(0=ik)个石子,将ai存储于任意数组num[i]中,对其按降序进行排列,选出num[i]+i的最大值,即为所需石子数。poj1694http://poj.org/problem?id=1694
阅读全文
摘要:用DFS算法即可。思想:(1)按照苹果数递减的方法,从而保证了所排列的情况不会出现重复的现象。(2)判断条件(s==n)即所排列的盘子数和总盘子数相等的情况下,比较所放的苹果数是否相等,即 t==m. (3)利用count来记录每次排列完比较后的结果,也就是题目所要求的不同分法。poj1664http://poj.org/problem?id=1664
阅读全文