dfs写法,邻接矩阵写法:
#include <vector>
#include <iostream>
using namespace std;
vector<int> path;
vector<vector<int>> res;
void dfs(const vector<vector<int>>& graph , int x ,int n)
{
if(x == n)
{
res.push_back(path);
return;
}
for(int i = 1 ; i <= n ; i++)
{
if(graph[x][i] == 1)//找到x到i的路径
{
path.push_back(i);
dfs(graph,i,n);
path.pop_back();
}
}
}
int main()
{
int n,m,s,j;
cin >> n >> m;
vector<vector<int>> graph(n+1,vector<int>(n+1,0));
while(m--)
{
cin >> s >> j;
graph[s][j] = 1;
}
path.push_back(1);
dfs(graph,1,n);
if(res.size() == 0) cout <<-1<<endl;
for(const vector<int>& i : res)
{
for(int j = 0; j < i.size() - 1; ++j)
{
cout <<i[j]<<" ";
}
cout<< i[i.size() - 1]<<endl;
}
}
邻接表写法:
#include <vector>
#include <iostream>
#include <list>
using namespace std;
vector<int> path;
vector<vector<int>> res;
void dfs(const vector<list<int>>& graph , int x ,int n)
{
if(x == n)
{
res.push_back(path);
return;
}
for(int i : graph[x])
{//找到x到i的路径
path.push_back(i);
dfs(graph,i,n);
path.pop_back();
}
}
int main()
{
int n,m,s,j;
cin >> n >> m;
vector<list<int>> graph(n+1);
while(m--)
{
cin >> s >> j;
graph[s].push_back(j);
}
path.push_back(1);
dfs(graph,1,n);
if(res.size() == 0) cout <<-1<<endl;
for(const vector<int>& i : res)
{
for(int j = 0; j < i.size() - 1; ++j)
{
cout <<i[j]<<" ";
}
cout<< i[i.size() - 1]<<endl;
}
}
给你一个有 n
个节点的 有向无环图(DAG),请你找出所有从节点 0
到节点 n-1
的路径并输出(不要求按特定顺序)
graph[i]
是一个从节点 i
可以访问的所有节点的列表(即从节点 i
到节点 graph[i][j]
存在一条有向边)。
示例 1:
输入:graph = [[1,2],[3],[3],[]] 输出:[[0,1,3],[0,2,3]] 解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3
class Solution {
public:
vector<int> path;
vector<vector<int>> res;
void dfs(const vector<vector<int>>& graph,int start, int end)
{
if(start == end)
{
res.push_back(path);
return ;
}
for(int i : graph[start])
{
path.push_back(i);
dfs(graph,i,end);
path.pop_back();
}
}
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph)
{
path.clear();
res.clear();
path.push_back(0);
dfs(graph,0,graph.size() -1 );
return res;
}
};
每写出来看的别人的
class Solution {
public:
int minimumOperations(string num) {
//个人分析
//贪心算法 可以看作 从最大长度 找顺序组合 然后看是否是特殊数据
int n=num.size();
int ans=0; //操作次数
//如何处理字符串? 将其转化为整数型
//能被25整除
//分为一下情况 00 25 50 75 0 全删去 总共六种 //可以分类讨论 0 就是只剩下一个0
bool find0=false,find5=false;
for(int i=n-1;i>=0;i--){
if(num[i]=='0' || num[i]=='5'){
if(find0==true)
return n-i-2; //-i表示去除i之前的个数 -2 表示减去两个数 剩下的就是要删除的数目
if(num[i]=='0')
find0=true;
else{
find5=true;
}
}
else if(num[i]=='2' || num[i]=='7'){
if(find5==true)
return n-i-2;
}
}
if(find0==true)
return n-1;//只剩一个0
return n;//全删
}
};