hdu5438(2015长春赛区网络赛1002)拓扑序+DFS
题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少。
通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去它的所有边,即对没条边连的点度数减一,度数减为1继续入队,直到队列为空,入过队列的点都进行标记,表示该点不在圈上,那么剩余没有标记的点一定要么在圈上、要么是单点或自环。这时候只要对于每个没有访问过的节点,DFS遍历它的连通区域,记录点数和权值和,如果点数为奇数,则统计权值和。但是注意如果只有一个点,不能算作一个圈,所以除了判断点数是否奇数,还需要判断点数大于1。
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #include<math.h>
- #include<queue>
- #include<iostream>
- typedef long long ll;
- using namespace std;
- const int maxn=;
- const int maxm=;
- int head[maxn],point[maxm],nxt[maxm],id[maxn],size,vis[maxn];
- int v[maxn];
- int n,m;
- void init(){
- memset(head,-,sizeof(head));
- size=;
- memset(id,,sizeof(id));
- memset(vis,,sizeof(vis));
- }
- void add(int a,int b){
- point[size]=b;
- nxt[size]=head[a];
- head[a]=size++;
- id[b]++;
- point[size]=a;
- nxt[size]=head[b];
- head[b]=size++;
- id[a]++;
- }
- void topo(){
- queue<int>q;
- for(int i=;i<=n;++i)if(id[i]==){
- id[i]=-;
- q.push(i);
- }
- while(!q.empty()){
- int u=q.front();
- q.pop();
- for(int i=head[u];~i;i=nxt[i]){
- int j=point[i];
- id[j]--;
- if(id[j]==){
- id[j]=-;
- q.push(j);
- }
- }
- }
- }
- int nnum=;
- ll sum=;
- void dfs(int s){
- vis[s]=;
- nnum++;
- sum+=v[s];
- for(int i=head[s];~i;i=nxt[i]){
- int j=point[i];
- if(!vis[j]&&id[j]>)dfs(j);
- }
- }
- int main(){
- int T;
- scanf("%d",&T);
- while(T--){
- scanf("%d%d",&n,&m);
- init();
- for(int i=;i<=n;++i)scanf("%d",&v[i]);
- while(m--){
- int a,b;
- scanf("%d%d",&a,&b);
- add(a,b);
- }
- topo();
- ll ans=;
- for(int i=;i<=n;++i){
- if(!vis[i]&&id[i]>){
- sum=;
- nnum=;
- dfs(i);
- if(nnum%&&nnum>)ans+=sum;
- }
- }
- cout<<ans<<endl;
- }
- return ;
- }
hdu5438(2015长春赛区网络赛1002)拓扑序+DFS的更多相关文章
- hdu5443(2015长春赛区网络赛1007)暴力
题意:给了一个数列,有多个询问,每个询问求某个区间内的最大值 数列长度 1000,询问个数 1000,静态,并不需要RMQ这些,直接暴力 n2 查找每个询问区间取最大值就行了. #include< ...
- hdu5442(2015长春赛区网络赛1006)后缀数组+KMP /最小表示法?
题意:给定一个由小写字母组成的长度为 n 的字符串,首尾相连,可以从任意一个字符开始,顺时针或逆时针取这个串(长度为 n),求一个字典序最大的字符串的开始字符位置和顺时针或逆时针.如果有多个字典序最大 ...
- hdu5441(2015长春赛区网络赛1005)类最小生成树、并查集
题意:有一张无向图,一些点之间有有权边,某条路径的值等于路径上所有边的边权的最大值,而某个点对的值为这两点间所有路径的值的最小值,给出多个询问,每个询问有一个值,询问有多少点对满足其值小于等于询问值. ...
- 2015 ACM-ICPC国际大学生程序设计竞赛北京赛区网络赛 1002 Mission Impossible 6
题目链接: #1228 : Mission Impossible 6 解题思路: 认真读题,细心模拟,注意细节,就没有什么咯!写这个题解就是想记录一下rope的用法,以后忘记方便复习. rope(块状 ...
- hdu 4274 2012长春赛区网络赛 树形dp ***
设定每个节点的上限和下限,之后向上更新,判断是否出现矛盾 #include<cstdio> #include<iostream> #include<algorithm&g ...
- hdu 4277 2012长春赛区网络赛 dfs+hashmap ***
hashmap判重大法好 #include<cstdio> #include<iostream> #include<algorithm> #include<c ...
- hdu 4273 2012长春赛区网络赛 三维凸包中心到最近面距离 ***
新模板 /* HDU 4273 Rescue 给一个三维凸包,求重心到表面的最短距离 模板题:三维凸包+多边形重心+点面距离 */ #include<stdio.h> #include&l ...
- hdu 4272 2012长春赛区网络赛 dfs暴力 ***
总是T,以为要剪枝,后来发现加个map就行了 #include<cstdio> #include<iostream> #include<algorithm> #in ...
- Largest Point (2015沈阳赛区网络赛水题)
Problem Description Given the sequence A with n integers t1,t2,⋯,tn. Given the integral coefficients ...
随机推荐
- Android VersionedGestureDetector手势事件
今天研究了一下PhotoView,发现里面的自定义的手势事件可以支持所有的SDK版本,该事件可以实现拖拽.滑动.缩放功能.下面直接上代码: public abstract class Versione ...
- 《day18_String练习_基本类型包装类_集合入门》
package cn.itcast.api.String.test; public class StringTest_1 { public static void main(String[] args ...
- lightoj1080 线段树
//Accepted 6628 KB 520 ms //I a b 把a到b区间的二进制位去反,转化成a到b区间的数全部加1 //Q a 判断第a位的奇偶 #include <cstdio> ...
- JS 验证一组input框是否为空的方法
function checkInput() { var $tr = $("#tb_confirmed .scrollContent").find("tr"); ...
- (转)Sqlite中INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用
原文:http://www.cnblogs.com/peida/archive/2008/11/29/1343832.html Sqlite中INTEGER PRIMARY KEY AUTOINCRE ...
- 破解 CrackMe#1 [UBC] by bRaINbuSY
系统 : Windows xp 程序 : CrackMe#1 程序下载地址 :http://pan.baidu.com/s/1nuagj6h 要求 : 编写注册机 使用工具 :IDA & OD ...
- HDU 2291
http://acm.hdu.edu.cn/showproblem.php?pid=2291 读题读的烦死了,今天果真不适合做题 题意:给两个n*n的矩阵,第一个代表一个人战胜一个人可以得到的经验值, ...
- js千分位的函数
不错的js千分位函数,适用于将金额每3位用“,”分隔 /*for price using thousands separator */ function fprice(s,n){ s = parseF ...
- Core Java Volume I — 3.5. Operators
3.5. OperatorsThe usual arithmetic operators +, -, *, / are used in Java for addition, subtraction, ...
- Think Python - Chapter 18 - Inheritance
In this chapter I present classes to represent playing cards, decks of cards, and poker hands.If you ...