九度oj 题目1109:连通图
- 题目描述:
-
给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
- 输入:
-
每组数据的第一行是两个整数 n 和 m(0<=n<=1000)。n 表示图的顶点数目,m 表示图中边的数目。如果 n 为 0 表示输入结束。随后有 m 行数据,每行有两个值 x 和 y(0<x, y <=n),表示顶点 x 和 y 相连,顶点的编号从 1 开始计算。输入不保证这些边是否重复。
- 输出:
-
对于每组输入数据,如果所有顶点都是连通的,输出"YES",否则输出"NO"。
- 样例输入:
-
4 3
1 2
2 3
3 2
3 2
1 2
2 3
0 0
- 样例输出:
-
NO
YES 这个题一开始用深度优先搜索做的,代码如下#include <cstdio>
#include <cstdlib>
#include <cstring> int map[][];
int flag[];
int n, m; void dfs(int k) {
flag[k] = ;
for(int i = ; i <= n; i++) {
if(flag[i] == && map[k][i] == ) {
dfs(i);
}
}
} int main(int argc, char const *argv[])
{
//freopen("input.txt","r",stdin);
while(scanf("%d %d",&n,&m) != EOF && n != ) {
memset(map,, sizeof(map));
memset(flag, , sizeof(flag)); while(m--) {
int a, b;
scanf("%d %d",&a, &b);
map[a][b] = map[b][a] = ;
}
flag[] = ;
dfs();
bool isOk = true;
for(int i = ; i <=n; i++) {
if(flag[i] == ) {
isOk = false;
break;
}
}
if(isOk) {
puts("YES");
}
else {
puts("NO");
} }
return ;
}但耗时略长,内存占用略大
后来试了试迪杰特斯拉算法的变形
#include <cstdio>
#include <cstdlib>
#include <cstring> int map[][];
int flag[];
int n, m; void dfs(int k) {
flag[k] = ;
for(int i = ; i <= n; i++) {
if(flag[i] == && map[k][i] == ) {
dfs(i);
}
}
} int main(int argc, char const *argv[])
{
freopen("input.txt","r",stdin);
while(scanf("%d %d",&n,&m) != EOF && n != ) {
memset(map,, sizeof(map));
memset(flag, , sizeof(flag)); while(m--) {
int a, b;
scanf("%d %d",&a, &b);
map[a][b] = map[b][a] = ;
}
flag[] = ; for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
if(flag[j] == && map[][j] == ) {
flag[j] = ;
for(int k = ; k <= n; k++) {
if(map[j][k] == ) {
map[][k] = ;
}
}
}
}
} bool isOk = true;
for(int i = ; i <=n; i++) {
if(flag[i] == ) {
isOk = false;
break;
}
}
if(isOk) {
puts("YES");
}
else {
puts("NO");
} }
return ;
}但耗时更长
也试了试flyod算法
#include <cstdio>
#include <cstdlib>
#include <cstring> int map[][];
int n, m; int main(int argc, char const *argv[])
{
//freopen("input.txt","r",stdin);
while(scanf("%d %d",&n,&m) != EOF && n != ) {
memset(map,, sizeof(map)); while(m--) {
int a, b;
scanf("%d %d",&a, &b);
map[a][b] = map[b][a] = ;
}
map[][] = ;
for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
for(int k = ; k <= n; k++) {
if(map[j][i] == && map[i][k] == ) {
map[j][k] = ;
}
}
}
} bool isOk = true;
for(int i = ; i <=n; i++) {
if(map[][i] == ) {
isOk = false;
break;
}
}
if(isOk) {
puts("YES");
}
else {
puts("NO");
} }
return ;
}直接超时了
突然会想起一个月前做的题,好像叫做并查集的东西,代码如下
#include <cstdio>
#include <cstdlib>
#include <cstring> int next[];
int n, m; int find(int t) {
while(next[t] != ) {
t = next[t];
}
return t;
} int main(int argc, char const *argv[])
{
//freopen("input.txt","r",stdin);
while(scanf("%d %d",&n,&m) != EOF && n != ) {
memset(next, , sizeof(next)); while(m--) {
int a, b;
scanf("%d %d",&a, &b);
int fa = find(a);
int fb = find(b);
if(fa != fb) {
next[fa] = b;
}
} int isOk = ;
for(int i = ; i <= n; i++) {
if(next[i] == ) {
isOk++;
if(isOk >= ) {
puts("NO");
break;
}
}
}
if(isOk == ) {
puts("YES");
} }
return ;
}耗时和内存都有质的飞跃,但如何再进一步优化呢?
九度oj 题目1109:连通图的更多相关文章
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- jQuery的基本使用及选择器和筛选器
回顾 事件 鼠标clickdblclickcontextmenumouseentermouseleavemousemovemousedownmouseup键盘keydownkeyupkeypress ...
- okhttputils使用(zhuan)
OkHttpUtils 封装了okhttp的网络框架,支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持Https和自签名证书,支持 ...
- 大数据freestyle: 共享单车轨迹数据助力城市合理规划自行车道
编者按:近年来,异军突起的共享单车极大地解决了人们共同面临的“最后一公里”难题,然而,共享单车发展迅猛,自行车道建设却始终没有能够跟上脚步.幸运的是摩拜单车大量的轨迹数据为我们提供了一种新的思路:利用 ...
- php 正则符号说明
preg_match_all ("/<b>(.*)<\/b>/U", $userinfo, $pat_array); preg_match_all (&qu ...
- 在linux下面安装mysql 确认 配置文件路径 my.cnf
1.确认服务器my.cnf 文件路径.但不知道那个是 2.通过which mysql命令来查看mysql的安装位置: 3.通过/usr/local/mysql/bin/mysqld --verbose ...
- nginx 编译某个模板的问题./configure: error: SSL modules require the OpenSSL library. You can either do not enable the modules, or install the OpenSSL library into the system, or build the OpenSSL library stati
root@hett-PowerEdge-T30:/usr/local/src/nginx-1.9.8# ./configure --prefix=/usr/local/nginx --add-mod ...
- 如何在腾讯云上安装Cloud Foundry
Cloud Foundry是VMware推出的业界第一个开源PaaS云平台,它支持多种框架.语言.运行时环境.云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的 ...
- access处理重复创建表的方法。
第一种,使用MSysObjects表查找表名为当前创建表的名字的内容,相当于普通查询,但是access数据库有一个安全问题,就是有时候一开始是没有权限去调这些系统表的,这时可以再2007的access ...
- UVA 1151 Buy or Build (最小生成树)
先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...
- codeforces Gym 100338C Important Roads (重建最短路图)
正反两次最短路用于判断边是不是最短路上的边,把最短路径上的边取出来建图.然后求割边.注意重边,和卡spfa. 正权,好好的dijkstra不用,用什么spfa? #include<bits/st ...