您的位置:首页 > 其它

uva 196 Spreadsheet 拓扑排序 。坑爹的一题

2013-07-12 12:19 423 查看

uva 196 Spreadsheet

这题字符串处理上还是有点麻烦的,不过也还是可以处理

然后就是拓扑排序, 一开始是用一个个删除度数0的点的方法, 在POJ上过了 POJ数据果断水。。。 在UVA上无限超时。坑爹啊。 后来换成用DFS过了。不容易

PS:这题数据上是说要1 ~ 999 * 1 ~ 1800000多少的数据。。非常大。可是实际上只要开1000*1000的数组就可以过掉了。。 又是坑爹

代码
#include <stdio.h>
#include <string.h>

struct SB
{
int num;
int x[50];
int y[50];
int rx[55];
int ry[55];
int z;
int zz;
int du;
int judge;
} map[1005][1005];

int t;
int n, m;
int i, j, k;
int ii, jj;
char sb[2005];

int dfs(int x, int y)
{
int i;
if (map[x][y].z == 0)
return map[x][y].num;
for (i = 0; i < map[x][y].z; i++)
map[x][y].num += dfs(map[x][y].x[i], map[x][y].y[i]);
map[x][y].z = 0;
return map[x][y].num;
}
int main()
{
scanf("%d", &t);
while (t --)
{
memset(map, 0, sizeof(map));
memset(sb, 0, sizeof(sb));
scanf ("%d%d", &m, &n);
for (i = 1; i <= n; i ++)
{
getchar();
for (j = 1; j <= m; j ++)
{
scanf("%s", sb);
int l = strlen(sb);
if (sb[0] != '=')
{
int num = 0;
int f = 0;
if (sb[0] == '-')
f = 1;
for (k = f; k < l; k ++)
num = num * 10 + sb[k] - '0';
map[i][j].num = num;
if (f == 1)
map[i][j].num = -map[i][j].num;
}
else
{
int column = 0;
int row = 0;
int pos = 1;
map[i][j].num = 0;
while (pos < l)
{
while ((sb[pos] >= 'A') && (sb[pos] <= 'Z'))
{
column = column * 26 + sb[pos]-'A'+1;
++pos;
}
while ((pos < l) && (sb[pos] >= '0') && (sb[pos] <= '9'))
{
row = row * 10 + sb[pos] - '0';
++ pos;
}
map[i][j].x[map[i][j].z] = row;
map[i][j].y[map[i][j].z] = column;
map[i][j].du ++;
map[row][column].rx[map[row][column].zz] = i;
map[row][column].ry[map[row][column].zz] = j;
map[row][column].zz ++;
map[i][j].z ++;
row = 0;
column = 0;
++ pos;
}
}
}
}
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
{
if(map[i][j].z)
dfs(i, j);
}
for (i = 1; i <= n; i ++)
{
for (j = 1; j < m; j ++)
{
printf("%d ", map[i][j].num);
}
printf("%d\n", map[i][m].num);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM UVA