AcWing 1539. 等重路径
原题链接
中等
作者:
leo123456
,
2020-08-23 16:36:43
,
所有人可见
,
阅读 693
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=110;
int n,m,S;
bool g[N][N];
int w[N];
vector<vector<int>> res; //vector就是按字典序排序
void dfs(int u,int s,vector<int>& path) //&引用
{
bool is_leaf=true;
for(int i=0;i<n;i++)
if(g[u][i])
{
is_leaf=false;
break;
}
if(is_leaf)
{
if(s==S) res.push_back(path);
}
else
{
for(int i=0;i<n;i++)
if(g[u][i])
{
path.push_back(w[i]);
dfs(i,s+w[i],path);
path.pop_back(); //恢复现场
}
}
}
int main()
{
cin>>n>>m>>S;
for(int i=0;i<n;i++) cin>>w[i];
while(m--)
{
int father,cnt;
cin>>father>>cnt;
while(cnt--)
{
int son;
cin>>son;
g[father][son]=true;
}
}
vector<int> path;
path.push_back(w[0]);
dfs(0,w[0],path);
sort(res.begin(),res.end(),greater<vector<int>>());
for(auto p:res)
{
cout<<p[0];
for(int i=1;i<p.size();i++)
cout<<' '<<p[i];
cout<<endl;
}
return 0;
}