洛谷T46463
题目:求一个点s到v的路径的树目。对起点进行dfs,如果能达到终点就cnt++,不行就回溯。
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int maxx=220;
vector<int>adj[maxx];
int cnt;
int vis[maxx];
int n,m,s,t;
void dfs(int u){
if(u==t){
cnt++;
return;
}
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i];
if(!vis[v]){
vis[v]=1;
dfs(v);
vis[v]=0;
}
}
}
int main(){
cin>>n>>m>>s>>t;
while(m--){
int u,v,w;
cin>>u>>v>>w;
adj[u].push_back(v);
}
vis[s]=1;
dfs(s);
if(cnt==0)cout<<-1;
else cout<<cnt<<endl;
}
洛谷T464462
思路:对每个节点都进行一次dfs,在dfs前先看看这个点有没有访问过,没访问过就cnt++,对这个点dfs。让每个结点最大程度的染他经过的点。
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n, m, cnt, vis[5010];
vector <int> a[5010];
void dfs(int u)
{
vis[u] = 1;
int sz=a[u].size();
for (int i=0; i<sz; i++)
{
int v=a[u][i];
if (vis[v]==0)
dfs(v);
}
}
int main()
{
cin>>n>>m;
while(m--){
int u, v;
cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
}
for (int i=1; i<=n; i++)
if (vis[i]==0){
cnt++;
dfs(i);
}
cout<<cnt;
return 0;
}