您的位置:首页 > 其它

ZOJ-1589

2014-05-03 11:29 337 查看
好几天没写了。。前两天工作中要改UI的一个控件,看了N天ExtJs源码。。蛋疼死了,调JS BUG真心让人抓狂。言归正传,本题就是用Floyd算法求图的闭包传递,本来我自己写的算法是还用了另个矩阵保存了前次DP的结果,后来参考了别人代码里发现他们的DP矩阵都是直接刷新到当前矩阵的,这块还不是很理解,DP题一道都没搞过,最后还是把临时矩阵去掉了,以后做DP题时的时候可以深入理解下

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

static int map[26][26];

void floyd(int n)
{
int i, j, k;
for (k = 0; k <= n; k++)
for (i = 0; i <= n; i++)
for (j = 0; j <= n; j++)
map[i][j] = map[i][j] || (map[i][k] && map[k][j]);
}

int main()
{
int n, m, i, j, t, a, b, x[100], y[100];
char s[4];
scanf("%d", &n);
for (t = 1; t <= n; t++)
{
printf("Case %d:\n", t);
scanf("%d", &m);
getchar();
memset(map, 0, sizeof(map));
int temp, max = -1;
for (i = 0; i < m; i++)
{
gets(s);
if (s[1] == '<')
{
a = s[0] - 'A';
b = s[2] - 'A';
}
else
{
a = s[2] - 'A';
b = s[0] - 'A';
}
map[a][b] = 1;
x[i] = a;
y[i] = b;
temp = a > b ? a : b;
if (temp > max)
max = temp;
}
floyd(max);

for (i = 0; i < m; i++)
map[x[i]][y[i]] = 0;

int flag = 0;
for (i = 0; i <= max; i++)
for (j = 0; j <= max; j++)
if (map[i][j])
{
flag = 1;
printf("%c<%c\n", i + 'A', j + 'A');
}
if (!flag)
puts("NONE");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: