UVA - 1423 Guess(拓扑排序)
Posted CCSU_Cola
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA - 1423 Guess(拓扑排序)相关的知识,希望对你有一定的参考价值。
思路:根据sum[j]-sum[i]>0,可以知道j的值比i高,也就是可以连一条j到i的有向边,sum[j]-sum[i]<0,则反过来建边,由此跑拓扑序,排在前面的值一定大于或等于后面的,可以按照入队的顺序给值。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct tt{
int x,to;
};
tt e[20010];
int t,n;
char p[10010];
int d[110];
int q[110],ans[110],idx,h[100010],num[110];
bool vis[110];
void add(int a,int b){
e[idx].x=b,e[idx].to=h[a],h[a]=idx++;
}
void topsort(){
int l=1,r=0;
int x=10;
for(int i=0;i<=n;i++){
if(!d[i]){
q[++r]=i;
ans[i]=x;
}
}
--x;
while(l<=r){
int t=q[l++];
for(int i=h[t];i!=-1;i=e[i].to){
int j=e[i].x;
d[j]--;
if(!d[j]){
ans[j]=x;
q[++r]=j;
}
}
x--;
}
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
scanf("%s",p+1);
memset(d,0,sizeof d);
memset(h,-1,sizeof h);
memset(vis,0,sizeof vis);
idx=0;
int cnt=1;
for(int i=1;i<=n;++i){
for(int j=i;j<=n;++j){
char c=p[cnt++];
if(c == '+'){
++d[i-1];
add(j,i-1);
}
else if(c=='-'){
++d[j];
add(i-1,j);
}
}
}
topsort();
for(int i = 1; i <= n; ++i){
num[i] =ans[i]-ans[i-1];
}
for(int i = 1; i <= n; ++i){
if(i != 1) printf(" ");
printf("%d", num[i]);
}
printf("\\n");
}
}
以上是关于UVA - 1423 Guess(拓扑排序)的主要内容,如果未能解决你的问题,请参考以下文章