#include<bits/stdc++.h> using namespace std; bool vis[100010]; long long n,m,x,y,ans; long long k,v[100010],nex[100010],poi[100010]; long long a[10],num[100010]; void add_edge(long long x,long long y){ k++;v[k]=y;nex[k]=poi[x];poi[x]=k; }//链式前向星建图 void dfs(long long dep,long long x){ a[dep]=x; if(dep==4){//深度为4,进行验证。 if(a[1]==a[2]||a[1]==a[3]||a[2]==a[3]|| a[2]==a[4]||a[3]==a[4])return; //cout<<a[1]<<" "<<a[2]<<" "<<a[3]<<" "<<a[4]<<endl; ans++; return; } vis[x]=1; long long save=poi[x]; while(save>0){ dfs(dep+1,v[save]); save=nex[save]; } vis[x]=0; } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ cin>>x>>y; add_edge(x,y); add_edge(y,x); } for(int i=1;i<=n;i++) dfs(1,i); cout<<ans<<endl; return 0; }
时间: 2024-04-28 22:20:51 浏览: 7
这是一个使用链式前向星实现的求无向图中4个点构成的不同简单路径的数量的算法。具体来说,该算法先将无向图用链式前向星存储,然后对于每个点,进行深度为4的DFS遍历,记录经过的4个点,判断它们是否构成简单路径,如果是,则将答案加1。
算法的具体实现如下:
1. 定义vis数组,表示每个点是否被访问过;
2. 定义k,v,nex和poi数组,分别表示边的总数,边的终点,下一个边的位置和每个点的第一条边的位置;
3. 定义a数组,表示当前已经遍历到的4个点;
4. 定义ans变量,表示简单路径的数量;
5. 定义add_edge函数,用链式前向星建图;
6. 定义dfs函数,进行深度为4的DFS遍历,记录经过的4个点,判断它们是否构成简单路径,如果是,则将答案加1;
7. 在主函数中,读入图的信息,对于每个点,调用dfs函数进行遍历,最后输出答案。
需要注意的是,在dfs函数中,每次遍历到一个点时,需要将vis[x]设为1,表示该点被访问过;遍历完一个点的所有出边之后,需要将vis[x]设为0,表示该点未被访问过。这样可以避免重复遍历同一个点,也可以避免出现环的情况。
另外,需要注意的是,该算法的时间复杂度为O(n^4),对于较大的图,可能会超时,需要进行优化。
相关问题
#include <bits/stdc++.h> using namespace std
这段代码是一个C++的头文件引用和命名空间的使用示例。具体来说,`#include <bits/stdc++.h>`是一个常用的头文件引用方式,它包含了C++标准库中的所有头文件。而`using namespace std`则是为了使用`std`命名空间中的标准库函数和对象,这样就可以直接使用`cout`、`cin`等标准输入输出流对象,而不需要写`std::cout`、`std::cin`。
这种写法虽然方便,但也存在一些问题。首先,包含了所有的标准库头文件可能会导致编译时间变长。其次,使用了`using namespace std`会将整个`std`命名空间中的所有标识符引入当前作用域,可能会导致命名冲突。因此,在实际开发中,建议根据需要只包含需要的头文件,并使用具体的命名空间来避免潜在的问题。
#include <bits/stdc++.h> using namespace std;
这个头文件是C++11标准引入的,它包含了所有标准库中的头文件。使用这个头文件可以方便地在一个地方包含所有需要的头文件,而不需要一个一个地包含。这个头文件通常只在竞赛中使用,因为它不是标准C++头文件,不保证在所有编译器中都能正常工作。
以下是一个使用这个头文件的示例,实现输入4个整数a、b、c、d,将它们倒序输出:
```cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c, d;
cin >> a >> b >> c >> d;
cout << d << ' ' << c << ' ' << b << ' ' << a << endl;
return 0;
}
```