Guess UVALive - 4255 (拓扑排序)

Guess

UVALive - 4255

题意:

拓扑排序

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn=12;
 5 int p[maxn][maxn],b[maxn];
 6 int in[maxn];
 7 int n;
 8
 9 void top_sort(){
10     queue<int> q;
11     for(int i=0;i<=n;i++) if(in[i]==0) q.push(i);
12     while(!q.empty()){
13         int x=q.front();
14         q.pop();
15         for(int i=0;i<=n;i++) if(p[x][i]==1){
16             b[i]=b[x]-1;
17             in[i]--;
18             if(in[i]==0) q.push(i);
19         }
20     }
21 }
22 int main(){
23     int t;
24     scanf("%d",&t);
25     b[0]=0;
26     while(t--){
27         memset(b,0,sizeof(b));
28         memset(p,0,sizeof(p));
29         memset(in,0,sizeof(in));
30         scanf("%d",&n);
31         getchar();
32         int m=(n+1)*n/2;
33         char s;
34         for(int i=1;i<=n;i++){
35             for(int j=i;j<=n;j++){
36                 scanf("%c",&s);
37                 if(s==‘+‘) p[j][i-1]=1,in[i-1]++;
38                 else if(s==‘-‘) p[i-1][j]=1,in[j]++;
39             }
40         }
41         top_sort();
42         for(int i=1;i<=n;i++) printf("%d%c",b[i]-b[i-1],i==n?‘\n‘:‘ ‘);
43     }
44 }

时间: 2024-10-10 13:13:53

Guess UVALive - 4255 (拓扑排序)的相关文章

D - Guess UVALive - 4255 拓扑排序

Given a sequence of integers, a1, a2, . . . , an, we define its sign matrix S such that, for 1 ≤ i ≤ j ≤ n, Sij = " + " if ai + . . . + aj > 0; Sij = " ? " if ai + . . . + aj < 0; and Sij = "0" otherwise. For example, i

LA 4255 (拓扑排序 并查集) Guess

设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 15; 5 int n; 6 int G[maxn][maxn]; 7 char s[100]; 8 int sum[maxn], a[maxn]; 9 10

UVALive - 4255 - Guess (拓扑排序)

Guess 题目传送:Guess 白书例题 注意拓扑排序时,,入度同一时候为0的前缀和须要赋值为同一个数(这个数能够随机取.由于前缀和是累加的,每个a的数值都仅仅和前缀和之差有关).,由于此时能够看成他们的前缀和是相等的,不存在大小关系,,而存在大小关系的都连了一条有向边. .假设此时不赋值为同一个数,,可能对于符号0不是正解.,从而产生错误的结果.. AC代码: #include <map> #include <set> #include <list> #includ

UVALive 6467 Strahler Order 拓扑排序

这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ 以后能用CIN还是CIN吧 QAQ 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostre

UVALive 6264 Conservation --拓扑排序

题意:一个展览有n个步骤,告诉你每一步在那个场馆举行,总共2个场馆,跨越场馆需要1单位时间,先给你一些约束关系,比如步骤a要在b前执行,问最少的转移时间是多少. 解法:根据这些约束关系可以建立有向边,可以看出是拓扑排序问题,问题是怎样拓扑排序. 进行两次拓扑排序,分别建立两个集合,一个放场馆1举行的步骤,一个放场馆2的,然后第一次从场馆1开始进行拓扑排序,每次一个场馆取完后看另一个场馆是否有步骤要执行,有则执行,然后将度数变为0的压入队列,如此往复.第二次从场馆2开始进行.得出的最小值为答案.

uvalive 6393(uva 1572) Self-Assembly 拓扑排序

题意: 给出一些正方形,这些正方形的每一条边都有一个标号,这些标号有两种形式:1.一个大写字母+一个加减号(如:A+, B-, A-......), 2.两个0(如:00):这些正方形可以随意翻转和旋转,当两个正方形通过旋转或翻转,使得他们的公共边为相同大写字母并且符号相反时,他们就可以彼此结合拼在一起,现在给出n中正方形,每种正方形有无限多种,问这些正方形能否拼成一个无限大的结构. 题解: 容易想到,要使这些正方形形成无限大地结构,那么这些正方形通过拼接后一定能循环(即通过不断地拼接出现了和以

UVALive 4255 Guess

这道题目让我学到了很多 一道不走寻常路的题目,给定一串数列的 和 的正负号,即假设数列 为  a1,a2,a3.....an,则一致了 Sij的正负号或者是否等于0,Sij代表了 从 ai 到 aj的和.要你求出任意一种序列,满足题目给定的Sij条件 确实是看了白书上的思路都还不太知道怎么写,然后看了LRJ的代码才知道原来还可以如此实现 很容易联系到前缀和sum,也就是说我们现在 得到了 sum[i]-sum[j] (j<i) 的正负号情况,要求满足情况的数列,那我们如果能得到满足情况的 sum

拓扑排序讲解

在这里我们要说的拓扑排序是有前提的 我们在这里说的拓扑排序是基于有向无环图的!!!. (⊙o⊙)…我所说的有向无环图都知道是什么东西吧.. 如果不知道,我们下面先来来说说什么是有向无环图. 所谓有向无环图,顾名思义是不存在环的有向图(至于有向图是什么不知道的在前面我们有一个图论讲解上都有). 点的入度:以这个点为结束点的边数. 点的出度:以这个点为出发点的边的条数. 拓扑序就是对于一个节点的一个排列,使得(u,v)属于E,那么u一定出现在v的前面.然而拓扑排序就是一个用来求拓扑序的东西. 对于左

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>