【离散数学】 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 刑侦大队对涉及六个嫌 ...
随机推荐
- Java字节码
Java字节码 javap -c 反编译.class文件可得字节码 知乎讨论https://www.zhihu.com/question/27831730 栈和局部变量操作 将常量压入栈的指令 aco ...
- flask+jsonp跨域前后台交互(接口初体验)
1 # -*- coding: utf-8 -*- 2 from flask import Flask, jsonify 3 import psutil, time,json 4 5 app = Fl ...
- 专利系统数据库连接出现 base-64字符串中的无效字符 错误
错误提示如图: 解决方法: 1.进注册表修改如下 2.进入系统配置页面http://10.10.0.70/eaf/init 对数据库进行重新配置 3.若不行再将如下密码修改一下 重启IIS生效
- 张超超OC基础回顾_05 property修饰符,id类型,instancetype。。。
一.property 如果给一个属性同时提供了getter/setter方法, 那么我们称这个属性为可读可写属性 如果只提供了getter方法, 那么我们称这个属性为只读属性 如果只提供了setter ...
- pandas map, apply, applymap区别
map只对一个序列而言的. apply只是整个dataframe上任意一列或多列,或者一行或多行, 即可在任意轴操作. 在一列使用apply时,跟map效果一样. 多列时只能用apply. apply ...
- fiddler抓包时显示Tunnel to......443
打开手机浏览器,输入http://192.168.0.65:8888/FiddlerRoot.cer
- 2.Border Layout 自定义一个Layout来完成布局。
目标: 1.添加控件的函数 void QLayout::addWidget ( QWidget * w ) 在这个例子里面我们重载这个函数 void addWidget ( QWidget * w, ...
- Flask框架 之 学生管理分析
先看模板吧. index.html <body> <h1>学生列表</h1> <table border="1"> <thea ...
- ESP8266-iot-3
ESP8266 WIFI操作 参考资料 模式选择 程序: 把之前的Helloworld程序复制过来改成wifi工程 先输出获取的当前模式 编译后会出错,因为os_printf的头文件没有被包含进来 结 ...
- GO程序设计2——面向过程基础知识
1 简介 GO语言google开发的新语言.有如下特性: 自动垃圾回收.更丰富的内置数据类型.函数多返回值.错误处理.匿名函数和闭包.类型和接口.并发编程.反射.多语言混合编程 package mai ...