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 ...
随机推荐
- Oracle分页总汇
Oracle分页总汇 select * from (select a.*,rownum row_num from (select * from mytable t order by t.id desc ...
- window.location.assign和window.location.href区别
window.location.assign和window.location.href区别 window.location.assign(url)和window.location.href=url实现 ...
- 0425 os模块 ,模块和包
os模块 *os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd o ...
- JavaScript在执行代码之前会校验代码,声明变量提前至当前作用域最前面。
var name = 123; function getName(){ console.log(name); } getName(); 输出123 -------------------------- ...
- RabbitMQ事务确认机制(生产者)
消息确认机制 生产者 消费者 消费者如何确保消息一定消费成功 队列和消费者建立长连接,推送或者拉取形式. 消费者通过自动应答或者手动应答,队列服务器等待应答结果,如果没有应答结果那么保留给下一个消费者 ...
- Hadoop集群初始化启动
hadoop集群初始化启动 启动zookeeper ./zkServer.sh start 启动journalnode ./hadoop-daemon.sh start journalnode 格式化 ...
- MapReduce修改输出的文件名
MapReduce默认输出的文件名称格式如下:part-r-00000 自定义名称,比如editName,则输出的文件名称为:editName-r-0000,此方法没有彻底修改整个文件名,只修改了一部 ...
- 用用OGRE1.74搭建游戏框架(转载)
用OGRE1.74搭建游戏框架(一) 新版的OGRE出来了,不知什么原因抛弃了CEGUI.国内的教程好像也更新比较少了,在官网上还是发现不少资料的,现在参考官网上的一些资料来搭建一个游戏的框架. 参考 ...
- Codeforces Round #335 (Div. 2) C. Sorting Railway Cars
C. Sorting Railway Cars time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- BZOJ 1059 [ZJOI2007]矩阵游戏:二分图匹配
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 题意: 给你一个n*n的01矩阵. 你可以任意次地交换某两行或某两列. 问你是否可以 ...