CF542E Playing on Graph
图论思维好题,值得一做。
考虑怎样的情况是一定不合法的。结论:图不合法当且仅当存在奇环。
充分性证明:(1)三角形不合法;(2)任意缩奇环中的两个点将产生一个更小的奇环。
必要性证明:没有奇环的图为二分图,而二分图一定可以缩成链(*)
因为连接两条链会产生一条长度为两条链的和的一条新链,故考虑在每个二分联通子图中找出最长链即可。
考虑以一个点x作为链的起点,建一棵bfs树。
由于是二分图,bfs树同一层节点之间没有连边。
由于是bfs树,每个点的连边只能在相邻一层的范围内,且必定和上一层节点有连边。
那么我们把同一层节点缩在一起,就可以得到一条链(这也证明了*结论)。
思考为何此链为最长链。考虑若结论错误,则必存在如下回环的结构:
如图中的1\rightarrow 2\rightarrow 4\rightarrow 6\rightarrow 8
为了保持这条链的结构,则只能想办法通过缩1\rightarrow 8上的点断开1\rightarrow 8,然而缩点并不干扰连通性,故不可能。
时间复杂度\Theta(n^2),由于n\leq 1000,可以通过本题。
参考了这篇博客,他写的很好。
代码如下,仅供参考:
#include<bits/stdc++.h>
using namespace std;
#define inf 1e9
const int N=1005;
const int maxn=2e5+10;
int n,m,dis[N],len[N],ans;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
int beg[N],nex[maxn],to[maxn],w[maxn],e;
inline void add(int x,int y){
e++;nex[e]=beg[x];
beg[x]=e;to[e]=y;
}
int bel[N],col[N],scc,flag;
inline void dfs(int x){
bel[x]=scc;
for(int i=beg[x];i;i=nex[i]){
int t=to[i];
if(!bel[t])col[t]=1^col[x],dfs(t);
else if(col[x]==col[t])flag=1;
}
}
queue<int>q;
inline void bfs(int x){
memset(dis,-1,sizeof(dis));
q.push(x);dis[x]=0;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=beg[x];i;i=nex[i]){
int t=to[i];
if(dis[t]==-1){
dis[t]=dis[x]+1;
q.push(t);
}
}
}
}
int main(){
n=read(),m=read();
int x,y;
for(int i=1;i<=m;i++){
x=read(),y=read();
add(x,y),add(y,x);
}
for(int i=1;i<=n;i++)
if(!bel[i])scc++,dfs(i);
if(flag)return puts("-1"),0;
for(int i=1;i<=n;i++){
bfs(i);
for(int j=1;j<=n;j++)
len[bel[j]]=max(len[bel[j]],dis[j]);
}
for(int i=1;i<=scc;i++)
ans+=len[i];
printf("%d\n",ans);
return 0;
}
深深地感到自己的弱小。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!