【离散数学】 SDUT OJ 传递闭包 && memset 使用注意事项
传递闭包
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
已知有n头牛,m次战斗关系,询问最终可以确定排名的牛的数量。
Input
多组测试数据,对于每组测试数据,第1行输入两个整数n(1 <= n <= 100)和m(0 <= m <= 4950),分别表示有n头牛和m次战斗关系,之后m行每行输入两个正整数x和y表示编号为x的牛可以战胜编号为y的牛,数据保证合法,询问可以确定排名的牛的数量。
Output
对于每组测试数据,输出整数ans,表示可以确定排名的牛的数量。
Sample Input
5 5
4 3
4 2
3 2
1 2
2 5
Sample Output
2
#include<stdio.h>
#include<string.h>
int a[110][110];
/*头天晚上老是WA,第二天一样的代码就A了,肯定又是OJ的数据出了问题,本地对了就是对了;
Warshall算法不难写,计算牛的排名数量不太好想;
懒,改天再写注释*/
void warshell(int n)
{
//warshell算法;
int k, i, j;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(a[j][i])
{
for(k=1; k<=n; k++)
{
a[j][k] = a[j][k] + a[i][k];
if(a[j][k] >= 1)
a[j][k] = 1;
}
}
}
}
}
int main()
{
int m, n, x, y, i, j, ans, flag[110];
while(~scanf("%d %d", &n, &m))
{
ans = 0;
memset(a, 0, sizeof(a));
memset(flag, 1, sizeof(flag)); //不建议对int类型用memset函数赋非零值;但这里只是做个标记,对结果没影响;
while(m--)
{
scanf("%d %d", &x, &y);
a[x][y] = 1;
}
warshell(n);
for(j=1; j<=n; j++)
{
//确定排名需要两个条件;
//这里的排名情况是这样:4→3→2→5;
// ↑
// 1
//warshell之后就增加了传递性的箭头;
//用矩阵表示出来之后结合关系图就能看出两个条件了;
//一是除了没有自回路(a[i][i]=0)和不对称(a[i][j]=0时a[j][i]=1);
//二是这一列除了上面两个值是0外,其余全为1;
//
for(i=1; i<=n; i++)
{
if(i == j)
{
if(a[i][j])
{
flag[j] = 0; //a[i][i] = 1(有自回路)时,作出标记直接退出;
break;
}
}
else if(!a[i][j])
{
if(!a[j][i]) //对称的两个数全是0;作出标记直接退出 ;
{
flag[j] = 0;
break;
}
}
}
if(flag[j]) //不能用flag[j] == 1 判断;
{
ans++;
}
}
printf("%d\n", ans);
}
return 0;
}
/***************************************************
User name: jk170414高金满
Result: Accepted
Take time: 0ms
Take Memory: 196KB
Submit time: 2018-04-13 12:19:25
****************************************************/
——————————————分割线——————————————
有了新收获:
memset部分注意事项:
memset是计算机中C/C++语言函数。将s所指向的某一块内存中的后n个 字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为s。
char a[5];
memset(a,'1',5);
int a[5];
memset(a,1,20);
第一个程序为什么可以,而第二个不行
第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以输出是1没有问题。而第二个程序a是整型的,使用 memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009
如果用memset(a,1,20),就是对a指向的内存的20个字节进行赋值,每个都用数1去填充,转为二进制后,1就是00000001,占一个字节。一个int元素是4字节,合一起是0000 0001,0000 0001,0000 0001,0000 0001,转化成十六进制就是0x01010101,就等于16843009,就完成了对一个int元素的赋值了
结论:
memset是对字节进行操作,而且用memset对非字符型数组赋非零初值是不可取的;
【离散数学】 SDUT OJ 传递闭包 && memset 使用注意事项的更多相关文章
- SDUT OJ 2607
/*http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2607*/ 题目大意:给出一个字符串,求出里 ...
- SDUT OJ 图练习-BFS-从起点到目标点的最短步数 (vector二维数组模拟邻接表+bfs , *【模板】 )
图练习-BFS-从起点到目标点的最短步数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 在古老的魔兽传说中,有两个军团,一个叫天 ...
- SDUT OJ 1221 亲和数 (找出某个数n所有的因子数,只需要暴力:2->sqrt(n) 即可 )
亲和数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 如果a的因子和等于b,b的因子和等于a,且a≠b,则称a,b为亲和数对. ...
- 【离散数学】 SDUT OJ 建图
建图 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 编程使得程序可以接受一个图的点边 ...
- 【离散数学】SDUT OJ 指定长度路径数
指定长度路径数 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 题目给出一个有n个节点 ...
- 【离散数学】SDUT OJ 补图
补图 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 题目给出一个无向图,求该无向图关 ...
- 【离散数学】 SDUT OJ 偏序关系
偏序关系 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 给定有限集上二元关系的关系矩 ...
- 【离散数学】 SDUT OJ 集合的包含
集合的包含 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 已知含n个元素的集合的子集 ...
- 【离散数学】 SDUT OJ 谁是作案嫌疑人?
谁是作案嫌疑人? Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 刑侦大队对涉及六个嫌 ...
随机推荐
- python中shuffleSplit()函数
参数: n : int 数据集中的元素总数. n_iter : int (default 10) 重新洗牌和分裂迭代次数. test_size : float (default 0.1), int, ...
- js如何解析后台传过来的json字符串
1.js如何解析后台传过来的json字符串? 注意:js是无法直接接收和使用json或者Php的数据,用的话会出现undefined,所以要转换一下. 方式一: var str = '{"r ...
- 公共技术点之 Java 反射 Reflection
本文摘录地址: http://codekk.com/open-source-project-analysis/detail/Android/Mr.Simple/%E5%85%AC%E5%85%B1%E ...
- jsp Ajax请求(返回xml数据类型)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- java类中final方法的作用
不给子类复写这个方法.说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用 inline扩展 ...
- 10.IN 操作符
IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值. SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name ...
- R语言读取MySQL数据表
1.R中安装RODBC包 install.packages("RODBC") 2.在Windows系统下安装MySQL的ODBC驱动 注意区分32位和64位版本: http://d ...
- Python ---- super()使用
Python ---- super() 我们经常在类的继承当中使用super(), 来调用父类中的方法.例如下面: 1 2 3 4 5 6 7 8 9 10 11 12 13 class A: ...
- css模块化思想(一)
什么是css模块化思想?(what) 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种 处理复杂系统分解成为更 ...
- 彻底清除Window7下的360注册表
当流氓360遇到强迫症,将注定有一场厮杀... 今天装了个虚拟机,其中win7系统是在网上随便下载了一个,是非纯净版的,自带了360在内的好多软件,其他软件都轻松删掉,但查看注册表时发现竟然有360残 ...