暴力递归层数过多内存溢出(最大N样例会出现段错误):
#include<iostream>
#include<vector>
#include<set>
#include<unordered_map>
using namespace std;
struct Edge{
int v,num;
};
vector<Edge> adj[1010];
bool book[1010];
int n,m,res,endd;
bool dfs(int num){
if(res == m && endd == num) return true;
for(auto x:adj[num]){
if(!book[x.num]){
book[x.num] = true;
res++;
if(dfs(x.v)) return true;
res--;
book[x.num] = false;
}
}
return false;
}
int main(){
cin>>n>>m;
for(int i = 1; i <= m; i++){
int u,v;
cin>>u>>v;
adj[u].push_back({v,i});
adj[v].push_back({u,i});
}
int flag = 0;
vector<int> path;
for(int i = 1; i <= n; i++){
endd = i;
if(adj[i].size()){
for(auto x:adj[i]){
book[x.num] = true;
res++;
if(dfs(x.v)){
flag = 1;
break;
}
book[x.num] = false;
res--;
}
}
}
cout<<flag;
return 0;
}
度:一个顶点的度是指与该顶点相关联的边的条数,顶点v的度记作d(v)。自环边由于既是入度又是出度,因此度为2。
欧拉回路:1.图必须连通。 2.每个顶点的度均为偶数。
AC Code:
#include<iostream>
#include<vector>
#include<set>
#include<unordered_map>
using namespace std;
unordered_map<int,int> edge;
int f[1010];
int getf(int v){
if(f[v] == v) return v;
else return f[v] = getf(f[v]);
}
bool merge(int a,int b){
int t1 = getf(a);
int t2 = getf(b);
if(t1 != t2){
f[t2] = t1;
return true;
}
return false;
}
bool isodd(auto &edge,int number){
for(int i = 1; i <= number; i++){
if(edge[i]%2) return true;
}
return false;
}
int main(){
int n,m,count = 0;
cin>>n>>m;
for(int i = 1; i <= n; i++) f[i] = i;
for(int i = 1; i <= m; i++){
int u,v;
cin>>u>>v;
if(merge(u,v)){
count++;
}
edge[u]++;
edge[v]++;
}
//count == n-1说明n个点能连通
if(count == n-1 && !isodd(edge,n)) cout<<1;
else cout<<0;
return 0;
}