#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(图的各个连通分量遍历)的更多相关文章

  1. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  2. 图的存储及遍历 深度遍历和广度遍历 C++代码实现

    /*图的存储及遍历*/ #include<iostream> using namespace std; //----------------------------------- //邻接 ...

  3. 图的创建和遍历(BFS/DFS)

    图的表示方法主要有邻接矩阵和邻接表.其中邻接表最为常用,因此这里便以邻接表为例介绍一下图的创建及遍历方法. 创建图用到的结构有两种:顶点及弧 struct ArcNode { int vertexIn ...

  4. 【算法导论】图的深度优先搜索遍历(DFS)

    关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS). 深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点, ...

  5. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  6. 1048 图的宽度优先遍历序列 c语言

    描述 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge):E是G中边的有限集合.设V={0,1,2,……,n-1},图中的结点又称为顶点(vert ...

  7. 图的广度优先/层次 遍历(BFS) c++ 队列实现

    在之前的博文中,介绍了图的深度优先遍历,并分别进行了递归和非递归实现.BFS 无法递归实现,最广泛的实现是利用队列(queue).这与DFS的栈实现是极其相似的,甚至代码几乎都很少需要改动.从给定的起 ...

  8. 图的两种遍历:DFS&BFS

    DFS和BFS在图中的应用: 图连通性判定:路径的存在性:图中是否存在环:求图的最小生成树:求图的关键路径:求图的拓扑排序. DFS:简单的说,先一直往深处走,直到不能再深了,再从另一条路开始往深处走 ...

  9. 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)

    邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...

随机推荐

  1. PBR探索

    原理 根据能量守恒,以及一系列光照原理得出微表面BRDF(Bidirectional Reflectance Distribution Function)公式 // D(h) F(v,h) G(l,v ...

  2. Android JSON And Object Cast

    Ref:JSON字符串转换成Java实体类(POJO) Ref:Java.Json转换方式之二:Jackson Ref:Jackson 框架,轻易转换JSON Ref:几种序列化协议(protobuf ...

  3. java面向对象入门之方法参数的传递

    /* Name : Power by :Stuart Date:2015.4.25 */ class PassOn{ //创建show方法,把i传入,输出i+1的结果 public void show ...

  4. log4j2.xml的例子

    项目中用到的一个log4j2.xml的配置文件: <?xml version="1.0" encoding="UTF-8"?> <!--设置l ...

  5. Java基础教程:多线程基础(1)——基础操作

    Java:多线程基础(1) 实现多线程的两种方式 1.继承Thread类 public class myThread extends Thread { /** * 继承Thread类,重写RUN方法. ...

  6. js之Date(日期对象)

    通过日期对象我们可以进行一些对日期时间的操作处理 一.日期对象的创建: var myDate=new Date() 二.Date对象方法: Link:http://www.w3school.com.c ...

  7. OJ的runtime error exit code对应SIGTERM代码

    Signal Name Number Description SIGHUP 1 Hangup (POSIX) SIGINT 2 Terminal interrupt (ANSI) SIGQUIT 3 ...

  8. web框架详解之tornado 一 模板语言以及框架本质

    一.概要 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...

  9. 手机端适配rem代码片段

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. How MapReduce Works(转)

    原文地址:http://www.cnblogs.com/ggjucheng/archive/2012/04/23/2465820.html 一.从Map到Reduce MapReduce其实是分治算法 ...