题目描述:

给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。

输入:

每组数据的第一行是两个整数 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:连通图的更多相关文章

  1. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  2. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  3. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. CF1060D Social Circles

    思路: 贪心.既然每个人的左边是其他人的右边,每个人的右边是其他人的左边,那么使重叠的部分最多即可. 实现: #include <bits/stdc++.h> using namespac ...

  2. 2840 WIKIOI——评测

    2840 WIKIOI——评测 时间限制: 1 s 空间限制: 2000 KB 题目等级 : 白银 Silver       题目描述 Description Wikioi上有一题有N个测试点,时限为 ...

  3. setuid

    -r-s--x--x   #s就是setuid,仅可用在二进制文件,对目录设置无效

  4. MySQL存储引擎问题

    一.什么是存储引擎 数据库就是一种对数据进行管理和存储的软件,而它能够实现存储和管理数据的原因就是因为存储引擎的存在,存储引擎就是对存储数据.为存储的数据建立索引以及更新.查询数据等技术的实现方法:在 ...

  5. debug1: expecting SSH2_MSG_KEX_ECDH_REPLY解决

    设置mtu ifconfig en1 mtu 1200 代理工具 退出lantern,退出shadowsocks

  6. mac ssd开启trim模式

    开启方法 sudo trimforce enable

  7. 生成随机ID且唯一

    var T = [ {P:11,G:2}, {P:101,G:7}, {P:1009,G:26}, {P:10007,G:59}, {P:100003,G:242}, {P:1000003,G:568 ...

  8. java在线聊天项目0.9版 实现把服务端接收到的信息返回给每一个客户端窗口中显示功能之客户端接收

    客户端要不断接收服务端发来的信息 与服务端不断接收客户端发来信息相同,使用线程的方法,在线程中循环接收 客户端修改后代码如下: package com.swift; import java.awt.B ...

  9. 求NEXT数组和KMP匹配的两种写法

    注释掉的是我不喜欢的写法. //计算串str的next数组 void getnext(char *str){ int len=strlen(str); ,k=-; next[]=-; while(j& ...

  10. Django2.x中url路由的path()与re_path()参数解释

    在新版本Django2.x中,url的路由表示用path和re_path代替,模块的导入由django1.x版本的from django.conf.urls import url,include变成现 ...