7.27 邻接表存无向图,给定两个顶点,判断是否存在一条长度为的简单轨道。
#include <bits/stdc++.h>
using namespace std;
struct ArcNode{
int to;
ArcNode* next;
};
struct VNode{
int id;
ArcNode* first;
}vex[100];
void AddEdge(int u,int v){
if(!vex[u].first){
vex[u].first=new ArcNode;
vex[u].first->to=v;
vex[u].first->next=NULL;
return;
}
ArcNode* p=new ArcNode;
p->next=vex[u].first;
p->to=v;
vex[u].first=p;
}
void CreatGraph(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
AddEdge(u,v);
AddEdge(v,u);
}
}
bool vis[100];
bool dfs(int u,int v,int k){
if(!k){
if(u==v) return 1;
return 0;
}
vis[u]=1;
ArcNode* p=vex[u].first;
while(p){
if(!vis[p->to]){
if(dfs(p->to,v,k-1)) return 1;
vis[p->to]=0;
}
p=p->next;
}
return 0;
}
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
CreatGraph();
int u,v,k;
cin>>u>>v>>k;
cout<<(dfs(u,v,k)?"YES":"NO")<<endl;
return 0;
}
7.29 邻接矩阵存有向图,求给定两个顶点,
之间不含回路的轨道数。
#include <bits/stdc++.h>
using namespace std;
bool AdjMat[100][100];
int n,m;
void CreatGraph(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
AdjMat[u][v]=1;
}
}
int res;
bool vis[100];
void dfs(int u,int v,int k){
if(!k){
if(u==v) res++;
return;
}
vis[u]=1;
for(int i=1;i<=n;i++){
if(AdjMat[u][i]&&!vis[i]){
dfs(i,v,k-1);
vis[i]=0;
}
}
}
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
CreatGraph();
int u,v,k;
cin>>u>>v>>k;
dfs(u,v,k);
cout<<res;
return 0;
}
7.30 求有向图G中的简单回路。
#include <bits/stdc++.h>
using namespace std;
bool AdjMat[100][100];
int n,m;
void CreatGraph(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
AdjMat[u][v]=1;
}
}
vector<int> res;
int num;
bool vis[100];
void output(){
int len=res.size();
for(int i=0;i<len-1;i++) cout<<res[i]<<"->";
cout<<res[len-1];
putchar(10);
}
void dfs(int u,int v){
for(int i=1;i<=n;i++){
if(AdjMat[u][i]){
if(i==v){
res.push_back(v);
output();
res.pop_back();
continue;
}
if(!vis[i]){
res.push_back(i);
vis[i]=1;
dfs(i,v);
vis[i]=0;
res.pop_back();
}
}
}
}
void solve(){
for(int i=1;i<=n;i++){
res.clear();
res.push_back(i);
dfs(i,i);
for(int j=1;j<=n;j++) AdjMat[i][j]=0;
}
}
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
CreatGraph();
solve();
return 0;
}