您的位置:首页 > 其它

uva 196 Spreadsheet(电子表格)

2015-03-21 18:03 302 查看
题意:给出你一个表格,其中一些给出了确定的值,而另一部分只给出了一个表达式,现在要你求出整个表格。

分析:将表格中的每一个格子看成一个点,所给出的表达式就是边,建图后,按照拓扑排序的顺序计算,即可以得到整个表格的值。

刚开始被题目的数据吓到了,我想999*26*26*26=17558424这么多的元素,怎么都超内存了啊,后来看到别人博客上说只有1000*1000的元素,才开始做。。。

AC代码:

#include <iostream>
#include <cstdio>
#include <cctype>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

const int maxn = 1000005;

int n,m;
char s[10000];
long long vex[maxn];
vector<int> list[maxn];
int in[maxn];//入度
queue<int> q;

void input(){

scanf("%d%d",&m,&n);

//clear
for(int i = 0; i <= m*n; i++){
in[i] = 0; vex[i] = 0; list[i].clear();
}

for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
scanf("%s",s);
if(s[0] == '='){
int col = 0;//列
int row = 0;//行
for(int k = 1; k <= strlen(s); k++){
if( k == strlen(s) || s[k] == '+'){
int u = col+(row-1)*m;
int v = j+(i-1)*m;
list[u].push_back(v);
in[v]++;
col = 0; row = 0;
}
else if(isalpha(s[k])){
col = col*26 + (s[k]-'A'+1);
}
else if(isdigit(s[k])){
row = row*10 + (s[k]-'0');
}
}
}
else{
int u = j+(i-1)*m;
int value;
sscanf(s,"%d",&value);
vex[u] = value;
}
}
}
}

void topsort(){
for(int i = 1; i <= m*n; i++){
if(in[i] == 0) q.push(i);
}

for(int i = 1; i <= n*m; i++){
int u = q.front(); q.pop();
for(int j = 0; j < list[u].size(); j++){
int v = list[u][j];
vex[v] += vex[u];
if(--in[v] == 0){
q.push(v);
}
}
}
}

void solve(){
topsort();

for(int i = 1; i <= m*n; i++){
if(i % m == 0) printf("%d\n",vex[i]);
else printf("%d ",vex[i]);
}
}

int main(){
int t;
scanf("%d",&t);
while(t--){
input();
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: