//(1)相等的归于一个并茶几中
//(2)大小关系通过拓扑排序判断
//(3)拓扑排序的同时构造答案
//小于 <
int n,m;
int f[MAXN];
char s[1111][1111];
int ans[MAXN];
int deg[MAXN];//入度
vector<int>mp[2222];
int find(int x) { return x==f[x]?x:f[x]=find(f[x]);}
int vis[MAXN];
bool topo()
{
queue<int>q;
rpp(i,n+m) if(i==f[i]&°[i]==0) q.push(i),ans[i]=1,vis[i]=1;
while(q.size())
{
int x=q.front();q.pop();
for(auto v:mp[x])
if(--deg[v]==0&&vis[v]==0) q.push(v),ans[v]=ans[x]+1,vis[v]=1;
}
rpp(i,n+m) if(i==f[i]&&ans[i]==0) return 0;
return 1;
}
signed main()
{
cin>>n>>m;
rpp(i,n+m) f[i]=i;
rpp(i,n)
{
scanf("%s",s[i]+1);
rpp(j,m) if(s[i][j]=='=') f[find(i)]=find(j+n);
}
rpp(i,n+m) find(i);
rpp(i,n) rpp(j,m)
{
if(s[i][j]=='<') mp[f[i]].push_back(f[j+n]),++deg[f[j+n]];
if(s[i][j]=='>') mp[f[j+n]].push_back(f[i]),++deg[f[i]];
}
if(!topo()) cout<<"NO\n";
else
{
cout<<"YES\n";
rpp(i,n+m)
{
cout<<ans[f[i]]<<" ";
if(i==n||i==n+m) cout<<endl;
}
}
return 0;
}
02-24
804
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-13
07-13
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交