“英特尔杯”全国计算机多核程序设计大赛复赛试题-第三题
2007-06-04 23:10
381 查看
问题描述:
有a,b,c,d,e五个城市,假设城市间的道路都是单向的,那么我们用(a,b)表示从城市a到城市b有一条道路。那么这样我们就可以把这五个城市间的道路连通集写成这样:
R={(a, a), (a, b), (b, d), (d, b), (c, e)}。
表示a->a,a->b,b->d,d->b,c->e各有一条通路。
然而这种表示方法虽然很直观,但是不利于计算机处理。所以人们通常用二值矩阵的形式表示,取矩阵中对应相关元素相交处的值为1,其它地方的的值为0。于是可以得到如下矩阵:
a b c d e
a┌ 1 1 0 0 0 ┐
b│ 0 0 0 1 0 │
B =c│ 0 0 0 0 1 │
d│ 0 1 0 0 0 │
e└ 0 0 0 0 0 ┘
根据传递性,如果 a->b, b->c, 则a->c。在以上矩阵中,a与b相连且b与d相连,因为(a,b)和(b,d)在R中,所以可以从a经过一定的路径到达d。 但 (a,d)不在集合R中,这就是隐含关系,我们将包含这些隐含关系的集合记为R+。
所以R+={(a, a), (a, b), (a, d), (b, b), (b, d), (d, b), (d, d), (c, e)}。
这个集合包含(a, d), (b, b), (d, d)是根据传递性定义(即由a->b, b->d, 推出a->d; 由b->d, d->b, 推出b->b; 由d->b, b->d, 推出d->d而来的。描述关系R+的矩阵如下:
a b c d e
a┌ 1 1 0 1 0 ┐
b│ 0 1 0 1 0 │
B+ =c│ 0 0 0 0 1 │
d│ 0 1 0 1 0 │
e└ 0 0 0 0 0 ┘
题目的要求就是给定一个 N 维的矩阵 B,N <= 1000,求该矩阵的传递闭包B+。
命令行:
Ø answer3 data3.dat
输入文件格式:
data3.dat数据格式如下,其中第一个数 n 表示数据集个数,此后跟随着 n
组测试数据。
示例:
6
0 0 1 0 0 0
0 0 0 1 0 0
0 0 1 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0
0 0 0 1 0 0
输入文件格式:
同上。
程序框架:
#include <omp.h>
#include <stdio.h>
int main()
{
int n;//n<=1000
int b[1000][1000];
int i, j, k;
/********************************/
FILE *fp1=fopen("test.dat","rb");
FILE *fp2;
fread(&n,sizeof(int),1,fp1);
fread(b,sizeof(int), n*n,fp1);
fclose(fp1);
/********************************/
/*在这里处理数据*/
/********************************/
/*输出结果*/
fp2 = fopen("result3.dat","wb");
fwrite(b,sizeof(int),n*n,fp2);
fclose(fp2);
return 0;
/********************************/
}
现在能想到的是动态规划算法.
就是有向图有n个顶点,任意两个顶点之间的距离为Dij=0(当B[i][j]==1),或者为1(当B[i][j]==0),求所有顶点到其他顶点的最短路径.最后把所有路径等于0的B+[i][j]=1,大于0的B+[i][j]=0.
有a,b,c,d,e五个城市,假设城市间的道路都是单向的,那么我们用(a,b)表示从城市a到城市b有一条道路。那么这样我们就可以把这五个城市间的道路连通集写成这样:
R={(a, a), (a, b), (b, d), (d, b), (c, e)}。
表示a->a,a->b,b->d,d->b,c->e各有一条通路。
然而这种表示方法虽然很直观,但是不利于计算机处理。所以人们通常用二值矩阵的形式表示,取矩阵中对应相关元素相交处的值为1,其它地方的的值为0。于是可以得到如下矩阵:
a b c d e
a┌ 1 1 0 0 0 ┐
b│ 0 0 0 1 0 │
B =c│ 0 0 0 0 1 │
d│ 0 1 0 0 0 │
e└ 0 0 0 0 0 ┘
根据传递性,如果 a->b, b->c, 则a->c。在以上矩阵中,a与b相连且b与d相连,因为(a,b)和(b,d)在R中,所以可以从a经过一定的路径到达d。 但 (a,d)不在集合R中,这就是隐含关系,我们将包含这些隐含关系的集合记为R+。
所以R+={(a, a), (a, b), (a, d), (b, b), (b, d), (d, b), (d, d), (c, e)}。
这个集合包含(a, d), (b, b), (d, d)是根据传递性定义(即由a->b, b->d, 推出a->d; 由b->d, d->b, 推出b->b; 由d->b, b->d, 推出d->d而来的。描述关系R+的矩阵如下:
a b c d e
a┌ 1 1 0 1 0 ┐
b│ 0 1 0 1 0 │
B+ =c│ 0 0 0 0 1 │
d│ 0 1 0 1 0 │
e└ 0 0 0 0 0 ┘
题目的要求就是给定一个 N 维的矩阵 B,N <= 1000,求该矩阵的传递闭包B+。
命令行:
Ø answer3 data3.dat
输入文件格式:
data3.dat数据格式如下,其中第一个数 n 表示数据集个数,此后跟随着 n
组测试数据。
示例:
6
0 0 1 0 0 0
0 0 0 1 0 0
0 0 1 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0
0 0 0 1 0 0
输入文件格式:
同上。
程序框架:
#include <omp.h>
#include <stdio.h>
int main()
{
int n;//n<=1000
int b[1000][1000];
int i, j, k;
/********************************/
FILE *fp1=fopen("test.dat","rb");
FILE *fp2;
fread(&n,sizeof(int),1,fp1);
fread(b,sizeof(int), n*n,fp1);
fclose(fp1);
/********************************/
/*在这里处理数据*/
/********************************/
/*输出结果*/
fp2 = fopen("result3.dat","wb");
fwrite(b,sizeof(int),n*n,fp2);
fclose(fp2);
return 0;
/********************************/
}
现在能想到的是动态规划算法.
就是有向图有n个顶点,任意两个顶点之间的距离为Dij=0(当B[i][j]==1),或者为1(当B[i][j]==0),求所有顶点到其他顶点的最短路径.最后把所有路径等于0的B+[i][j]=1,大于0的B+[i][j]=0.
相关文章推荐
- “英特尔杯”全国计算机多核程序设计大赛复赛试题-第一题
- “英特尔杯”全国计算机多核程序设计大赛复赛试题--第二题
- “英特尔杯”全国计算机多核程序设计大赛复赛
- 第六届全国ITAT教育工程就业技能大赛复赛试题 Java程序设计(B卷)答案
- 第四届全国职工职业技能大赛维修电工、计算机程序设计员决赛在成都市举行
- 第三届全国ITAT教育工程就业技能大赛复赛试题 Java程序设计(A卷)答案
- 第五届全国ITAT教育工程就业技能大赛复赛试题 Java程序设计(A卷)答案
- 当全国计算机仿真大赛遇上大学生程序设计竞赛
- 全国2006年7月高等教育自学考试计算机基础与程序设计试题
- 信息工程学院技能大赛 计算机程序设计(Java)大赛试题
- 第五届全国ITAT教育工程就业技能大赛复赛试题 Java程序设计(B卷)答案
- 第三届全国ITAT教育工程就业技能大赛复赛试题 Java程序设计(B卷)答案
- 信息工程学院技能大赛 计算机程序设计(Java)大赛试题
- 信息工程学院技能大赛 计算机程序设计(Java)大赛试题
- 第五届全国职工技能大赛-计算机程序设计员决赛总结
- 全国2003年4月高等教育自学考试计算机基础与程序设计试题
- 全国2007年4月高等教育自学考试计算机基础与程序设计试题
- 百度之星2009程序设计大赛 晋级赛(复赛)试题
- 湖南省第六届 中信软件教育杯 大学生程序设计大赛试题 第三题 数字整除
- 广东理工职业学院第三届程序设计大赛试题及参考答案