题意:给出一个表格,一部分单元格是给定的数字,而另一部分单元格则是一个式子,表示是其他一些单元格的和,让你输出最后计算出的所有格子的数。

因为有些格子需要其他格子先计算出来,所以计算顺序是按照拓扑序的,只不过题意给出的表格大小非常恐怖……貌似是 1e9 级别的单元格数……后来看了discuss才知道数据只有100*100……然后就是读入了,我本来以为读入会很烦,后来写写才发现其实也挺容易的。然后就是排拓扑序并计算就行了。

 #include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; char s[];
int num[][],id[];
int head[],point[],nxt[],size;
int n,m; void add(int a,int b){
point[size]=b;
nxt[size]=head[a];
head[a]=size++;
id[b]++;
} void getnum(int a,int b){
for(int i=;s[i];++i){
num[a][b]=num[a][b]*+s[i]-'';
}
} void getedge(int a,int b){
int aa=,bb=;
for(int i=;s[i];++i){
if(s[i]>='A'&&s[i]<='Z'){
aa=aa*+s[i]-'A'+;
}
else if(s[i]>=''&&s[i]<=''){
bb=bb*+s[i]-'';
}
else if(s[i]=='+'){
add((bb-)*m+aa,(a-)*m+b);
aa=;
bb=;
}
}
add((bb-)*m+aa,(a-)*m+b);
} void topo(){
queue<int>q;
for(int i=;i<=n*m;++i)if(!id[i])q.push(i);
int cnt=;
while(!q.empty()){
int u=q.front();
q.pop();
int a=u/m,b=u%m;
if(b)a++;
else b=m;
cnt++;
for(int i=head[u];~i;i=nxt[i]){
int j=point[i];
id[j]--;
int aa=j/m,bb=j%m;
if(bb)aa++;
else bb=m;
num[aa][bb]+=num[a][b];
if(!id[j])q.push(j);
}
}
} int main(){
int T;
scanf("%d",&T);
while(T--){
memset(num,,sizeof(num));
memset(id,,sizeof(id));
memset(head,-,sizeof(head));
size=;
scanf("%d%d",&m,&n);
for(int i=;i<=n;++i){
for(int j=;j<=m;++j){
scanf("%s",s);
if(s[]=='=')getedge(i,j);
else getnum(i,j);
}
}
topo();
for(int i=;i<=n;++i){
for(int j=;j<=m;++j){
printf("%d",num[i][j]);
if(j==m)printf("\n");
else printf(" ");
}
}
}
return ;
}

poj1420 拓扑序的更多相关文章

  1. 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)

    3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved:  ...

  2. BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)

    无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...

  3. hdu5438(2015长春赛区网络赛1002)拓扑序+DFS

    题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...

  4. poj3553 拓扑序+排序贪心

    题意:有多个任务,每个任务有需要花费的时间和最后期限,任务之间也有一些先后关系,必须先完成某个才能开始某个,对于每个任务,如果没有越期,则超时为0,否则超时为结束时间-最后期限,求总超时时间最小的任务 ...

  5. poj2762 强连通+拓扑序

    题意:有 n 个房间,不同房间之间有单向通道,问是否任意两个房间 A .B 都可以从 A 到 B 或从 B 到 A(有一条有就可以). 在这题中,如果一些点是在同一个强连通分量中,那么这些点肯定能够相 ...

  6. poj1270 拓扑序(DFS)

    题意:给出将会出现的多个字母,并紧接着给出一部分字母的大小关系,要求按照字典序从小到大输出所有符合上述关系的排列. 拓扑序,由于需要输出所有排列,所以需要使用 dfs ,只要点从小到大遍历就可以实现字 ...

  7. poj1128 拓扑序(DFS)

    题意:给出一张图,它是由一系列字母框按一定顺序从下到上摆放,因此上面的字母框会覆盖一部分下面的字母框,确保每个字母框的四条边都至少会出现一个点,要求输出所有可行的摆放顺序,字典序从小到大输出. 首先可 ...

  8. poj3687 拓扑序

    题意:有编号 1-n 的球,每个球的质量不同,质量从 1 到 n 不等,给出一系列比较,分别是两个编号的球的大小关系,求一个序列满足上述关系,并且从编号 1 开始依次选择可选的最小质量,输出每个球的质 ...

  9. poj2367 拓扑序

    题意:有一些人他们关系非常复杂,一个人可能有很多后代,现在要制定一种顺序,按照前辈在后代前排列就行 拓扑序裸题,直接建边拓扑排序一下就行了. #include<stdio.h> #incl ...

随机推荐

  1. [转]VS2005 Debug时提示"没有找到MSVCR80D.dll"的解决办法

    总结各种解决方法如下: 原因:(不知道在说啥)由于VS.net 2005 采用了一种新的DLL方案,搞成一个exe还要配有一个manifest文件(一般在嵌入文件里了,所以看不到,不过也可以不嵌入,这 ...

  2. ODI中的临时接口

    在ODI 11g及后续的版本中,针对复杂的ETL处理,可分解为多个步骤,在中间步骤中使用临时接口,而不用建立相应的物理表,ODI会在处理过程中自动创建和删除这些中间表,从而降低ETL处理复杂度:同时, ...

  3. 《JAVA学习笔记(14-1---14-7)》

    [14-1]面向对象-继承-概述 /* //描述学生 class Student { //属性 String name; int age; //行为 void study() { System.out ...

  4. c规范(2)

    一:对齐 1 程序的分界符' {'和' }'应独占一行并且位于同一列,同时与引用它们的语句左对齐. 2  { }之内的代码块在' {'右边数格处左对齐. 二:注释 注释通常用于:( 1)版本.版权声明 ...

  5. 重拾java系列一java基础(2)

    1.分支流程控制 if(布尔表达式/分支条件){  //语句块} if(布尔表达式/分支条件){  //语句块1}else{  //语句块2} if(条件1){  //语句块1}else if(条件2 ...

  6. Oracle之ROW_NUMBER() OVER函数

    语法:ROW_NUMBER() OVER(ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的select ACD_ID,ROW_NUMBE ...

  7. 数据结构《10》----二叉树 Morris 中序遍历

    无论是二叉树的中序遍历还是用 stack 模拟递归, 都需要 O(n)的空间复杂度. Morris 遍历是一种 常数空间 的遍历方法,其本质是 线索二叉树(Threaded Binary Tree), ...

  8. 结构体,内存,指针例题.DOC

    2015.1.30 递归函数:1.自身调用自己:2.要有结束条件!typedef 后面加分号:一般后面的重定义名加_,例如:typedef unsigned long int uint_16;结构体成 ...

  9. Spring注解和配置方式

    Spring提供了一个org.springframework.beans.factory.FactoryBean工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑. 从Spring3.0开始, ...

  10. Fish入门

    安装以及配置 Linux和OS X基本都可以通过源来安装,实在不行就下载源码编译,不难的. 安装好第一步是修改OS默认shell: chsh -s /usr/bin/fish 然后就可以直接使用了,就 ...