求出每条边两边有多少个点。
来源:互联网 发布:电脑桌面软件怎么变小 编辑:程序博客网 时间:2024/04/29 06:53
题目链接swjtu
Shortest Path
题解:只需要判断一条边两边的点数是否都为偶数,如果都为偶数,那么不加这条边,否则加上这条边。
关键,dfs一遍,求出每条边两边有多少个点。
#include<bits/stdc++.h>using namespace std;typedef pair<int,int>P;typedef long long ll;struct node{ int a,b,c,next;}edge[20010];int cnt;int head[10010];ll ans,res;int vis[10001],l[10001],r[10001],w[10001];void add(int a,int b,int c){ edge[cnt].b=b; edge[cnt].c=c; edge[cnt].next=head[a]; head[a]=cnt++;}int dfs(int u,int fa){ int summ=1; for(int i=head[u];i!=-1;i=edge[i].next) { int sum=0; node e=edge[i]; if(!vis[e.b]) { vis[e.b]=1; sum+=dfs(e.b,u); if(sum%2) ans+=e.c; summ+=sum; } } return summ;}int main(){ int t,a,b,c; scanf("%d",&t); while(t--) { memset(head,-1,sizeof(head)); int n;cnt=0;scanf("%d",&n);ans=0; for(int i=1;i<n;i++) { scanf("%d%d%d",&a,&b,&c); add(a,b,c);add(b,a,c); l[i]=a,r[i]=b,w[i]=c; } memset(vis,0,sizeof(vis)); vis[1]=1; dfs(1,-1); printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- 求出每条边两边有多少个点。
- 在9个点上画10条直线,要求每条直线上有3个点
- 平面上N个点,每两个点都确定一条直线,求出斜率最大的那条直线所通过的两个点
- 平面上N个点,每两个点都确定一条直线, 求出斜率最大的那条直线所通过的两个点
- 平面上N个点,每两个点都确定一条直线, 求出斜率最大的那条直线所通过的两个点
- 平面上N个点,每两个点都确定一条直线,求出斜率最大的那条直线所通过的两个点
- 求出任意N!的末尾有多少个零
- 用Java求出n!中有多少个0
- C++求解:平面上有n个点,问总共可以组成多少条直线
- 【IQ题】求穿过3点或3点以上有多少条边
- HDU 1312 统计有多少个点
- HDU 1312 统计有多少个点
- Codeforces Round #375 (Div. 2) E. One-Way Reform(有n个点,m条无向边,给每条边定向,使得入度等于出度的点最多)
- LA 3720 Highway n x m的点阵 有多少条直线穿过至少2个点
- hDU2767Equivalences【强连通缩点+添加多少条边可以使有向图强连通】
- hDU2767Equivalences【强连通缩点+添加多少条边可以使有向图强连通】
- 有n个圆,每2个圆都有公共点
- 9个点画10条直线,要求每条直线上至少3个点
- Android Studio项目上传到码云问题总结
- HDU4027-Can you answer these queries?(线段树+思路)
- 8大排序算法图文讲解
- eclipse从SVN 引入的项目无法编译
- 解决transition动画与display冲突的几种方法
- 求出每条边两边有多少个点。
- linux 访问物理空间的方法
- cobbler
- spring_DBCP数据库连接池_DataSource配置创建获取
- rabbitmq installation for CentOS
- mysql解决锁表脚本
- centos7 cobbler
- 本地http://localhost打开需要密码
- IMWeb提升营Day1 | 训练题4:重建二叉树