poj1420 拓扑序

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

因为有些格子需要其他格子先计算出来,所以计算顺序是按照拓扑序的,只不过题意给出的表格大小非常恐怖……貌似是 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 ;
}
上一篇:Python基础——条件判断


下一篇:强大的Resharp插件(转)