给你对于任意一个 ai,bj 的大小关系的判断,让你构造 a,b 序列满足条件。无解输出No
拓扑排序+并查集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <iostream> #include <cstring> #include <queue> using namespace std ; const int N=4000,M =1e6+3; #define int long long int n,m, in[N],fa[N],D[N]; int nxt[M],go[M],hd[N],all; void add_( int x, int y){ go[++all]=y,nxt[all]=hd[x]; hd[x]=all; } int find( int x){ return x==fa[x]? x:fa[x]=find(fa[x]); } void cmb( int i, int j){ int fx= find(i), fy=find(j); fa[fy]=fx; } void Topo(){ int i,x,Sum=0,num=0; queue< int > q; for (i=1;i<=n+m;i++){ int fx=find(i); if (fx!=i) continue ; if (in[i]==0){ q.push(i); D[i]=1; } ++Sum; } while (q.empty()==0){ x=q.front(); q.pop(); num++; for (i=hd[x];i;i=nxt[i]){ int y=go[i]; D[y]=max(D[y],D[x]+1); if (--in[y]==0) q.push(y); } } if (Sum==num){ cout<< "Yes\n" ; for (i=1;i<=n;i++) cout<<D[find(i)]<< ' ' ; cout<<endl; for (i=n+1;i<=n+m;i++) cout<<D[find(i)]<< ' ' ; } else { cout<< "No\n" ; } } char op[N][N]; signed main(){ char c; cin>>n>>m; for ( int i=1;i<=n+m;i++) fa[i]=i; for ( int i=1;i<=n;i++) for ( int j=1;j<=m;j++){ cin>>op[i][j]; c=op[i][j]; if (c== '=' ) cmb(i,n+j); } for ( int i=1;i<=n;i++) for ( int j=1;j<=m;j++){ if (op[i][j]== '<' ) in[find(j+n)]++,add_(find(i),find(j+n)); if (op[i][j]== '>' ) in[find(i)]++,add_(find(j+n),find(i)); } Topo() ; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!