NC243747. Just Some Bad Memory
描述
输入描述
见 PDF 题面
输出描述
见 PDF 题面
示例1
输入:
3 3 1 2 2 3 1 3
输出:
-1
示例2
输入:
4 0
输出:
5
示例3
输入:
5 4 1 2 2 3 3 4 4 5
输出:
2
示例4
输入:
4 6 1 2 1 3 1 4 2 3 2 4 3 4
输出:
0
示例5
输入:
4 4 1 2 2 3 3 4 4 1
输出:
1
示例6
输入:
7 7 1 2 2 3 3 4 4 1 5 6 6 7 7 5
输出:
0
C++(g++ 7.5.0) 解法, 执行用时: 135ms, 内存消耗: 36056K, 提交时间: 2022-10-04 15:18:55
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define endl '\n' #define pii pair<int,int> #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int maxn=1e6+5; int n,m; vector<int>g[maxn]; int dfn[maxn],dep[maxn],tag[maxn],tim,has_odd,has_even; int max_odd; void dfs(int x,int fa){ dfn[x]=++tim; for(auto v:g[x]){ if(v!=fa){ if(!dfn[v]){ dep[v]=dep[x]+1; dfs(v,x); tag[x]+=tag[v]; }else if(dfn[v]<dfn[x]){ if((dep[x]-dep[v])%2)has_even=1; else{ has_odd=1; max_odd=max(dep[x]-dep[v]+1,max_odd); } tag[x]++; tag[v]--; } } } if(tag[x]>1)has_even=1; } int check(){ for(int i=1;i<=n;i++){ for(auto x:g[i]){ if(g[i].size()>2&&g[x].size()>2)return 1; for(auto j:g[i]){ if(j==x)continue; for(auto y:g[x]){ if(y==i)continue; if(j!=y)return 1; } } } } return 0; } int main(){ IOS cin>>n>>m; if(n<4){ cout<<-1<<endl; return 0; } for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; g[x].push_back(y); g[y].push_back(x); } for(int i=1;i<=n;i++){ if(!dfn[i])dfs(i,-1); } if(has_even&&has_odd)cout<<0<<endl; else if(has_even)cout<<1<<endl; else if(has_odd){ if(max_odd>3||check())cout<<1<<endl; else cout<<2<<endl; }else { int ans=5-min(2,m); for(int i=1;i<=n;i++)if(g[i].size()>2)ans=2; for(int i=1;i<=n;i++){ for(auto j:g[i]){ if(g[i].size()>1&&g[j].size()>1)ans=2; } } cout<<ans<<endl; } }