HDU 4514 【非联通无向图判环,树直径】
来源:互联网 发布:eve男性捏脸数据 编辑:程序博客网 时间:2024/04/29 18:31
题目很明显是判环+树直径。
然后自己有这么几个坑点。
第一是没有搞清楚哪一种方法拿来判环合适。第二是没想到图可能是不连通的,需要循环寻找每棵树进行直径的寻找。第三是在找直径上的dfs上有错。。。
恩,然后就是手动扩栈了一下。
#pragma comment(linker, "/STACK:102400000,102400000")#include <stdio.h>#include <iostream>#include <stack>#include <string.h>using namespace std;#define maxn 1000100#define maxm 100010struct node{ int v,val,next;}que[maxn<<1];int head[maxm];int top,ans,n,m,st,cnt;int vis[maxm],dp[maxm],a[maxm],father[maxm];void add(int x,int y,int z){ que[top].v=x;que[top].val=z;que[top].next=head[y];head[y]=top++; que[top].v=y;que[top].val=z;que[top].next=head[x];head[x]=top++;}int min(int x,int y){return x<y?x:y;}int max(int x,int y){return x>y?x:y;}/*void dfs(int u){ vis[u]=1; int j,v; for(j=head[u];j!=-1;j=que[j].next) { v=que[j].v; if(vis[v]) continue; dfs(v); dp[u]=max(dp[u],dp[v]+que[j].val); ans=max(dp[u],ans); break; } if(j==-1) return; for(j=que[j].next;j!=-1;j=que[j].next) { v=que[j].v; if(vis[v]) continue; dfs(v); dp[u]=max(dp[u],dp[v]+que[j].val); ans=max(ans,dp[u]); }}*/int dfs(int k,int deep,int len){ vis[k]=1; if(ans<deep)ans=deep; if(head[k]==-1) return 0; int j,v,temp,maxr=0; int dis[2],cnt=0; for(j=head[k];j!=-1;j=que[j].next) { v=que[j].v; if(vis[v]) continue; temp=dfs(v,deep+que[j].val,que[j].val); if(maxr<temp) maxr=temp; if(cnt<2) dis[cnt++]=temp; else { int f; if(dis[0]<dis[1]) f=0; else f=1; if(dis[f]<temp) dis[f]=temp; } } if(cnt>=2 && ans<dis[0]+dis[1]) ans=dis[0]+dis[1]; return maxr+len;}int find(int x){ int i=x; while(i!=father[i]) i=father[i]; int j=x,tmp; while(j!=i) { tmp=father[j]; father[j]=i; j=tmp; } return i;}void join(int x,int y){ father[x]=y;}int main(){ while(scanf("%d%d",&n,&m)!=EOF) { st=top=ans=cnt=st=0; for(int i=0;i<=n;i++) head[i]=-1,dp[i]=0,father[i]=i,vis[i]=0; int x,y,z; int flag=0; for(int i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&z); add(x,y,z); if(x!=y) {int xx=find(x),yy=find(y); if(xx==yy) flag=1; else join(xx,yy);} } top=0; if(flag) {printf("YES\n");continue;} for(int i=1;i<=n;i++) if(!vis[i]) dfs(i,0,0); printf("%d\n",ans); } return 0;}
0 0
- HDU 4514 【非联通无向图判环,树直径】
- HDU 4514 (无向图判断环及树的直径)
- 无向图的直径以及树的直径
- 无向图的直径以及树的直径
- 无向图的直径以及树的直径
- hdu 4612 Warm up(无向图Tarjan+树的直径)
- hdu 4612 Warm up(无向图Tarjan+树的直径)
- hdu 4612 Warm up (带有重边的无向图Tarjan+树的直径)
- HDU-4612-Warm up(无向图缩点+直径)
- HDU 4612 Warm up (边双联通,树的直径)
- HDU 4612 Warm up (树的直径 + 双联通)
- HDU 4612 双联通分量+树的直径
- 【HDU 4514】【树的直径 dfs或者并查集判断环】【给定一个无向图,图可能是非连通的,如果图中存在环,就输出YES,否则就输出树的直径】
- BZOJ1002 无向联通图的生成树计数
- HDU 4612--Warm up 【无向图边双连通求桥数 && 缩点后重建图求树的直径】
- HDU 4612 Warm up(边双联通求树的直径)
- [HDU 4997 Biconnected] 无向图的边双联通子图计数 状压DP
- HDU 4738 --Caocao's Bridges 【无向图边双联通 && 求权值最小的桥 && 模板】
- 05-图3. 六度空间 (30)
- 链表满足条件的一次性多个删除
- HUD 2648 解题报告
- Mybatis 示例之 foreach (上)
- JSF注册ManagedBean的流程
- HDU 4514 【非联通无向图判环,树直径】
- 九度OJ-题目1517:链表中倒数第k个结点
- IIS部署网站
- css一些小tip
- 第六章 数据存储
- 判断二叉树是不是二叉查找树(BST)
- Unsupported major.minor version 51.0解决方案
- Nginx配置文件nginx.conf中文详解(总结)
- iOS 使用Quartz 2D画虚线