E. Reachability from the Capital

这个题目就是给你一个有向图,给你起点,问增加多少条边让这个图变成一个连通图。

这个因为n只有5000m只有5000

所以可以暴力枚举这个n,用n*n的复杂度过去。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <bitset>
using namespace std;
const int maxn=5e3+;
vector<int>G[maxn];
bool vis[maxn];
bool cnt[maxn];
int ans=;
void dfs(int u,int f){
ans++;
vis[u]=;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==f||vis[v]) continue;
dfs(v,u);
}
} int num;
void DFS(int u,int f){
if(vis[u]) return ;
num++;
cnt[u]=;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==f||vis[v]||cnt[v]) continue;
DFS(v,u);
}
}
vector<int>a;
int main(){
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
}
dfs(s,-);
for(int i=;i<=n;i++){
if(!vis[i]) a.push_back(i);
}
int res=;
while(ans<n){
int maxs=,id=-;
for(int i=;i<a.size();i++){
memset(cnt,,sizeof(cnt));
num=;
int x=a[i];
DFS(x,-);
if(num>maxs) maxs=num,id=x;
}
if(id==-) break;
res++;
dfs(id,-);
}
printf("%d\n",res);
return ;
}

未优化

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <bitset>
using namespace std;
const int maxn=5e3+;
vector<int>G[maxn];
bool vis[maxn];
bool cnt[maxn];
int ans=;
void dfs(int u,int f){
ans++;
vis[u]=;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==f||vis[v]) continue;
dfs(v,u);
}
} int num;
void DFS(int u,int f){
if(vis[u]) return ;
num++;
cnt[u]=;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==f||vis[v]||cnt[v]) continue;
DFS(v,u);
}
} void dfs2(int u,int f){
if(vis[u]) return ;
cnt[u]=;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==f||vis[v]||cnt[v]==) continue;
dfs2(v,u);
}
} vector<int>a;
int main(){
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
}
dfs(s,-);
for(int i=;i<=n;i++){
if(!vis[i]) a.push_back(i);
}
int res=;
while(ans<n){
int maxs=,id=-;
for(int i=;i<a.size();i++){
num=;
int x=a[i];
DFS(x,-);
dfs2(x,-);
if(num>maxs) maxs=num,id=x;
}
if(id==-) break;
res++;
dfs(id,-);
}
printf("%d\n",res);
return ;
}

dfs优化memset

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <bitset>
using namespace std;
const int maxn=5e3+;
vector<int>G[maxn];
bool vis[maxn];
bool cnt[maxn];
int ans=;
void dfs(int u,int f){
ans++;
vis[u]=;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==f||vis[v]) continue;
dfs(v,u);
}
} int num;
void DFS(int u,int f){
if(vis[u]) return ;
num++;
cnt[u]=;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==f||vis[v]||cnt[v]) continue;
DFS(v,u);
}
} void dfs2(int u,int f){
if(vis[u]) return ;
cnt[u]=;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==f||vis[v]||cnt[v]==) continue;
dfs2(v,u);
}
} vector<int>a;
int main(){
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
}
dfs(s,-);
for(int i=;i<=n;i++){
if(!vis[i]) a.push_back(i);
}
int res=;
while(ans<n){
int maxs=,id=-;
for(int i=;i<a.size();i++){
num=;
int x=a[i];
DFS(x,-);
dfs2(x,-);
if(num>maxs) maxs=num,id=x;
}
if(id==-) break;
res++;
dfs(id,-);
}
printf("%d\n",res);
return ;
}

memset优化

E. Reachability from the Capital dfs暴力的更多相关文章

  1. ACM: FZU 2107 Hua Rong Dao - DFS - 暴力

    FZU 2107 Hua Rong Dao Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  2. ACM: Gym 100935G Board Game - DFS暴力搜索

    Board Game Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u  Gym 100 ...

  3. hdu 5612 Baby Ming and Matrix games(dfs暴力)

    Problem Description These few days, Baby Ming is addicted to playing a matrix game. Given a n∗m matr ...

  4. hdu 1010 Tempter of the Bone(dfs暴力)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  5. E - Reachability from the Capital

    E - Reachability from the Capital  CodeForces - 999E 题目链接:https://vjudge.net/contest/236513#problem/ ...

  6. NOIP 2002提高组 选数 dfs/暴力

    1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…, ...

  7. E. Reachability from the Capital(tarjan+dfs)

    求联通分量个数,在dfs一次 #include <iostream> #include <algorithm> #include <cstring> #includ ...

  8. Codeforces Round #313 (Div. 1) B. Equivalent Strings DFS暴力

    B. Equivalent Strings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/559 ...

  9. UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)

    题意:给一个的格子图,有 n 行单元格,每行有a[i]个格子,要求往格子中填1~m的数字,要求每个数字大于等于左边的数字,大于上边的数字,问有多少种填充方法. 析:感觉像个DP,但是不会啊...就想暴 ...

随机推荐

  1. tf.nn.sigmoid_cross_entropy_with_logits 分类

    tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,,labels=None,logits=None,name=None) logits和la ...

  2. 013-结构体-C语言笔记

    013-结构体-C语言笔记 学习目录 1.[掌握]返回指针的函数 2.[掌握]指向函数的指针 3.[掌握]结构体的声明 4.[掌握]结构体与数组 5.[掌握]结构体与指针 6.[掌握]结构体的嵌套 7 ...

  3. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(二)之Introduction to Objects

    The genesis of the computer revolution was a machine. The genesis of out programming languages thus ...

  4. Ant概念

    Ant是基于Java的.可以跨平台的项目编译和生成工具.

  5. Delphi学习手记——单引号和双引号的区别

    单引号和双引号的区别 双引号表示其中字符可能包含变量,而单引号表示整个引号内的东西都当成字符串来处理. 也就是说:没有内设变量就用单引号'',有就用双引号"". 举例说明: $va ...

  6. L8梯度消失、梯度爆炸

    houseprices数据下载: 链接:https://pan.baidu.com/s/1-szkkAALzzJJmCLlJ1aXGQ 提取码:9n9k 梯度消失.梯度爆炸以及Kaggle房价预测 代 ...

  7. Cobalt Strike系列教程第七章:提权与横向移动

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  8. Sublime text 3快捷键壁纸版

  9. mysql插入数字都变成2147483647的解决方法

    2147483647是int类型的最大值,所以插入11位的数字都会变成2147483647,把int改为bigint即可

  10. js点击事件,数字累加

    <!doctype html><html lang="en"><head>    <meta charset="utf-8&qu ...