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(拓扑排序)的主要内容,如果未能解决你的问题,请参考以下文章