用bool类型二维数组存储 u是否能到vu是否能到v
以P5318为例。
#include <bits/stdc++.h>#define LL long long#define ls (p<<1)#define rs (p<<1|1)#define INF INT_MAX#define lowbit(x) (x&-x)#define mod 1000000007#define ULL unsigned long longvoid write(LL x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+48);}LL read(){ LL 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;}using namespace std;const int N=1e5+5;int n,m,ans[N];bool vis[N];vector<int> edge[N*10];void dfs(int x){ vis[x]=1; printf("%d ",x); for(int y:edge[x]){ if(vis[y]) continue; dfs(y); }}queue<int> q;void bfs(int s){ q.push(s); vis[s]=1; while(!q.empty()){ int x=q.front(); q.pop(); printf("%d ",x); for(int y:edge[x]){ if(vis[y]) continue; q.push(y),vis[y]=1; } }}int main(){#ifdef LOCAL freopen("in.in","r",stdin); freopen("ans.out","w",stdout);#endif n=read(),m=read(); int x,y; while(m--){ x=read(),y=read(); edge[x].push_back(y); } for(int i=1;i<=n;++i){ sort(edge[i].begin(),edge[i].end()); } dfs(1); puts(""); memset(vis,0,sizeof(vis)); bfs(1); return 0;}
以P3916为例。
#include <bits/stdc++.h>#define LL long long#define ls (p<<1)#define rs (p<<1|1)#define INF INT_MAX#define lowbit(x) (x&-x)#define mod 1000000007#define ULL unsigned long longvoid write(LL x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+48);}LL read(){ LL 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;}using namespace std;const int N=1e5+5;int n,m,tot,hd[N],ans[N];struct node{ int nxt,to;}edge[N];void add_edge(int u,int v){ edge[++tot]={hd[u],v}; hd[u]=tot;}void dfs(int x){ for(int i=hd[x];i;i=edge[i].nxt){ int y=edge[i].to; if(ans[y]) continue; ans[y]=ans[x]; dfs(y); }}int main(){#ifdef LOCAL freopen("in.in","r",stdin); freopen("ans.out","w",stdout);#endif n=read(),m=read(); int x,y; while(m--){ x=read(),y=read(); add_edge(y,x); } for(int i=n;i>=1;--i){ if(ans[i]) continue; ans[i]=i; dfs(i); } for(int i=1;i<=n;++i){ printf("%d ",ans[i]); } return 0;}
__EOF__
发表于 2024-07-02 17:46阅读:32评论:0推荐:0
Orz
stO
storz
好长的良心题解,赞!
%%%
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?