HDOJ5438(图的各个连通分量遍历)
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX_N=;
template<class T>
struct Stack{
private:
T a[MAX_N];
int top;
public:
Stack(){ top=; }
void Push(T x)
{
a[top++]=x;
}
T Pop()
{
return a[--top];
}
bool isEmpty()
{
return top==;
}
};
struct Edge{
int from,to,next;
}edge[MAX_N];
int V,E;
int val[MAX_N];
int d[MAX_N];
int head[MAX_N];
int vis[MAX_N];
int cnt;
void addEdge(int u,int v)
{
Edge e={u,v,head[u]};
edge[cnt]=e;
head[u]=cnt++;
}
void getMap()
{
cnt=;
memset(d,,sizeof(d));
memset(head,-,sizeof(head));
for(int i=;i<E;i++)
{
int u,v;
scanf("%d %d",&u,&v);
addEdge(u,v);
addEdge(v,u);
d[u]++;
d[v]++;
}
}
void Clear()
{
memset(vis,,sizeof(vis));
Stack<int> ss;
for(int i=;i<=V;i++)
{
if(d[i]<=)
{
ss.Push(i);
vis[i]=;
}
}
while(!ss.isEmpty())
{
int x=ss.Pop();
for(int i=head[x];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(!vis[v]&&--d[v]<=)
{
ss.Push(v);
vis[v]=;
}
}
}
}
int used[MAX_N];
long long sum; //int 会溢出 WA了多次
int num;
void dfs(int u)
{
used[u]=;
if(d[u]>=)
{
sum+=val[u];
num++;
}
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(!used[v])
{
dfs(v);
}
}
}
long long ans;// int会溢出
void solve()
{
ans=;
Clear();
memset(used,,sizeof(used));
for(int i=;i<=V;i++)
{
sum=;
num=;
if(!used[i])
{
dfs(i);
if(num&)//题目中odd是奇数的意思
ans+=sum;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&V,&E);
for(int i=;i<=V;i++)
{
scanf("%d",&val[i]);
}
getMap();
solve();
printf("%lld\n",ans);
} return ;
}
HDOJ5438(图的各个连通分量遍历)的更多相关文章
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 图的存储及遍历 深度遍历和广度遍历 C++代码实现
/*图的存储及遍历*/ #include<iostream> using namespace std; //----------------------------------- //邻接 ...
- 图的创建和遍历(BFS/DFS)
图的表示方法主要有邻接矩阵和邻接表.其中邻接表最为常用,因此这里便以邻接表为例介绍一下图的创建及遍历方法. 创建图用到的结构有两种:顶点及弧 struct ArcNode { int vertexIn ...
- 【算法导论】图的深度优先搜索遍历(DFS)
关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS). 深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点, ...
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 1048 图的宽度优先遍历序列 c语言
描述 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge):E是G中边的有限集合.设V={0,1,2,……,n-1},图中的结点又称为顶点(vert ...
- 图的广度优先/层次 遍历(BFS) c++ 队列实现
在之前的博文中,介绍了图的深度优先遍历,并分别进行了递归和非递归实现.BFS 无法递归实现,最广泛的实现是利用队列(queue).这与DFS的栈实现是极其相似的,甚至代码几乎都很少需要改动.从给定的起 ...
- 图的两种遍历:DFS&BFS
DFS和BFS在图中的应用: 图连通性判定:路径的存在性:图中是否存在环:求图的最小生成树:求图的关键路径:求图的拓扑排序. DFS:简单的说,先一直往深处走,直到不能再深了,再从另一条路开始往深处走 ...
- 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)
邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...
随机推荐
- Apache Maven pom文件
Welcome to Apache Maven Apache Maven is a software project management and comprehension tool. Based ...
- Codeforces Round #254 (Div. 2)B. DZY Loves Chemistry
B. DZY Loves Chemistry time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 关于mosquitto_internal.h:40:25:#include <uuid/uuid.h> 致命错误的解决
一.安装mosquitto1.4的时候使用make的时候报以下错误: mosquitto_internal.h:40:25: 致命错误:openssl/ssl.h:没有那个文件或目录 #include ...
- Android Media应用开发
Java层API : AudioRecord 采集音频(PCM格式)AudioTrack 播放音频 Camera 用来采集摄像头的数据Surface / SurfaceView / GLSurface ...
- 数据库基本表创建 完整性约束 foreign Key
理解以下几张表的内容,根据实际情况设计属性名.数据类型.及各种完整性约束(primary key.foreign key.not null.unique.check),用数据定义语言实现,然后设计实验 ...
- IE盒模型和标准盒模型
标准盒模型和ie盒模型(怪异盒模型) w3c标准盒模型 width和height不包括padding和border ie盒模型 width和height包含padding和border ie8以上都是 ...
- 爬虫 spider
python 2.x # -*- coding: utf-8 -*-import reimport urllib url = 'http://tieba.baidu.com/p/4872795764' ...
- MySql-rules
1.mySql基础 USE day15; -- 创建表 CREATE TABLE teacher( id INT, NAME VARCHAR() ) -- 查看所有表 SHOW TABLES; DES ...
- JAVA- 切换默认的Java
删除自带的java yum remove java java -version发现还有java,因为电脑上安装了多个版本的java,这时我们可以用 yum groupremove java 通过组的这 ...
- Codeforces 453B Little Pony and Harmony Chest:状压dp【记录转移路径】
题目链接:http://codeforces.com/problemset/problem/453/B 题意: 给你一个长度为n的数列a,让你构造一个长度为n的数列b. 在保证b中任意两数gcd都为1 ...