cd graph
图论专场
Fairy(CF19E)
题目大意
给出一张无向图,求删除一条边后此图变成二分图的所有删边种类
思路
虽然看起来
#include<bits/stdc++.h> #define ll long long #define mm 10010 using namespace std; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); } return x*f; } struct node{ int nxt,v,id; }e[mm<<2]; int head[mm<<2],tot=1,dfn[mm]; int n,m,ans[mm],p[mm],f[mm],Ans; int c1[mm],c2[mm],cnt; void ADD(int x,int y,int id) { e[++tot]=(node){head[x],y,id}; head[x]=tot; } void dfs(int x,int fa,int pre) { dfn[x]=dfn[fa]+1; p[x]=e[pre].id; for(int i=head[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) { if((i^pre)==1) continue; if(!dfn[v]) { dfs(v,x,i); f[e[i].id]=1; c1[e[pre].id]+=c1[e[i].id]; c2[e[pre].id]+=c2[e[i].id]; } else { if(x==v && i&1) ++c1[e[i].id],++cnt; else { if(dfn[x]>dfn[v]) if((dfn[x]-dfn[v])&1) { ++c2[e[i].id]; ++c2[e[pre].id]; --c2[p[v]]; } else { ++c1[e[i].id]; ++c1[e[pre].id]; --c1[p[v]]; ++cnt; } } } } } void print() { printf("%d\n",Ans); for(int i=1;i<=Ans;i++) printf("%d ",ans[i]); } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { int x=read(),y=read(); ADD(x,y,i); ADD(y,x,i); } for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i,0,0); if(!cnt) { for(int i=1;i<=m;i++) ans[++Ans]=i; print(); return 0; } for(int i=1;i<=m;i++) if(f[i]) { if(c1[i]==cnt && !c2[i]) ans[++Ans]=i; } else { if(cnt==1 && c1[i]==1) ans[++Ans]=i; } print(); return 0; }
Connecting Cities(AT_keyence2019_e)
题目大意
给定
思路
还是用
既然
#include<bits/stdc++.h> #define ll long long #define mm 10010 using namespace std; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); } return x*f; } struct node{ int nxt,v,id; }e[mm<<2]; int head[mm<<2],tot=1,dfn[mm]; int n,m,ans[mm],p[mm],f[mm],Ans; int c1[mm],c2[mm],cnt; void ADD(int x,int y,int id) { e[++tot]=(node){head[x],y,id}; head[x]=tot; } void dfs(int x,int fa,int pre) { dfn[x]=dfn[fa]+1; p[x]=e[pre].id; for(int i=head[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) { if((i^pre)==1) continue; if(!dfn[v]) { dfs(v,x,i); f[e[i].id]=1; c1[e[pre].id]+=c1[e[i].id]; c2[e[pre].id]+=c2[e[i].id]; } else { if(x==v && i&1) ++c1[e[i].id],++cnt; else { if(dfn[x]>dfn[v]) if((dfn[x]-dfn[v])&1) { ++c2[e[i].id]; ++c2[e[pre].id]; --c2[p[v]]; } else { ++c1[e[i].id]; ++c1[e[pre].id]; --c1[p[v]]; ++cnt; } } } } } void print() { printf("%d\n",Ans); for(int i=1;i<=Ans;i++) printf("%d ",ans[i]); } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { int x=read(),y=read(); ADD(x,y,i); ADD(y,x,i); } for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i,0,0); if(!cnt) { for(int i=1;i<=m;i++) ans[++Ans]=i; print(); return 0; } for(int i=1;i<=m;i++) if(f[i]) { if(c1[i]==cnt && !c2[i]) ans[++Ans]=i; } else { if(cnt==1 && c1[i]==1) ans[++Ans]=i; } print(); return 0; }
Tournament(CF878C)
题目大意
有
定义淘汰赛的规则如下:在没被淘汰的人中选出两个
对于每个
思路
我们考虑两个选手之间的关系,如果一个选手能在某一项运动中战胜对手,那么就从他自身向对手连一条有向边。这样显然会出现很多环,于是可以缩点,将整张图缩成一条链。那么显然入度为零的环中包含的点数即为最后可能成为冠军的人数。
#include<bits/stdc++.h> #define ll long long using namespace std; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); } return x*f; } int n,k; struct node{ int siz; int maxn[15],minn[15]; node(){ memset(maxn,0,sizeof(maxn)); memset(minn,0x3f,sizeof(minn)); } friend bool operator <(node a,node b){ for(int i=1;i<=k;i++) if(a.maxn[i]>b.minn[i]) return false; return true; } }; set<node> s; set<node>::iterator it; int main() { n=read(),k=read(); node t; for(int i=1;i<=n;i++) { t.siz=1; for(int j=1;j<=k;j++) t.maxn[j]=t.minn[j]=read(); while((it=s.find(t))!=s.end()) { t.siz+=it->siz; for(int j=1;j<=k;j++) { t.minn[j]=min(t.minn[j],it->minn[j]); t.maxn[j]=max(t.maxn[j],it->maxn[j]); } s.erase(it); } s.insert(t); printf("%d\n",(--s.end())->siz); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!