hdu 5438 Ponds(toposort+DFS)
2015-09-13 20:02
375 查看
给一个无向图,将图中与其关联的边数小于2的点去掉,直到找不到这样的点为止,然后求奇块的权值和。
类似拓扑排序将度数小于2的点给去掉,然后剩下的点必然组成若干个圈,通过DFS标记边的同时统计顶点个数。若为奇块,累加权值即可。
注意数据范围啊。
类似拓扑排序将度数小于2的点给去掉,然后剩下的点必然组成若干个圈,通过DFS标记边的同时统计顶点个数。若为奇块,累加权值即可。
注意数据范围啊。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<stack> #include<vector> #include<queue> using namespace std; typedef __int64 LL; #define maxn 10005 struct Edge{ int to,next; }edge[200005]; int head[maxn],a[maxn],cnt,deg[maxn]; LL s,tot; inline void add(int u,int v) { edge[cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt++; } bool use[200005]; void dfs(int u) { for(int i=head[u];~i;i=edge[i].next) { int v=edge[i].to; if(use[i]||use[i^1]||!deg[v]) continue; use[i]=use[i^1]=1; ++tot; s+=a[v]; deg[v]=0; dfs(v); } } int main() { int n,m,T; cin>>T; while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d",&a[i]); cnt=0; memset(head,-1,sizeof(head)); memset(use,0,sizeof(use)); memset(deg,0,sizeof(deg)); for(int i=1;i<=m;++i) { int x,y; scanf("%d%d",&x,&y); add(x,y); add(y,x); ++deg[x]; ++deg[y]; } queue<int> Q; for(int i=1;i<=n;++i) if(deg[i]==1) { Q.push(i); deg[i]=0; } while(!Q.empty()) { int u=Q.front();Q.pop(); for(int i=head[u];~i;i=edge[i].next) { int v=edge[i].to; if(deg[v]) --deg[v]; if(deg[v]==1){ use[i]=use[i^1]=1; Q.push(v); deg[v]=0; } } } LL ans=0; for(int i=1;i<=n;++i) if(deg[i]){ s=a[i],tot=1; deg[i]=0; dfs(i); if(tot&1) ans+=s; } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- cheng@Linux--JZ2440学习之SecureCRT/SecureFX
- 【软件工程】 之 测试维护
- OpenCV之响应鼠标(三):响应鼠标信息
- openoffice在连接时有错误,无法连接上
- 2.4-nginx禁止指定user_agent
- Linux 文件管理基础命令和通配符基础知识
- Exceptionin thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(II[BI[BIILjav
- Opencv+Kinect2.0 的环境配置和获取彩色图
- linux 查找出包含某个字符串的所有文件的方法详解
- Linux 用户管理
- 如何将tomcat加入到linux服务中去
- CentOS-6.5下编译hadoop-2.6.0的eclipse插件
- 软件自动测试架构设计
- linux(centos) SPAM 问题
- linux 间拷贝文件
- 中国人最常用的密码TOP10,一猜即中,下次见到新WiFi要试试
- Linux里设置环境变量的方法(export PATH)
- 小案例--门户网站
- Linux下用普通用户安装mysql数据库(编译好的二进制包安装)
- 【Linux】RedHat9.0 利用sftp传文件