标签:dfs 杭州 hdu sizeof 不能 最好 pre next 多少
湫湫系列故事——设计风景线
Input 测试数据有多组,每组测试数据的第一行有两个数字n, m,其含义参见题目描述;
接下去m行,每行3个数字u v w,分别代表这条线路的起点,终点和长度。
[Technical Specification]
1. n<=100000
2. m <= 1000000
3. 1<= u, v <= n
4. w <= 1000
Output 对于每组测试数据,如果能够建成环形(并不需要连接上去全部的风景点),那么输出YES,否则输出最长的长度,每组数据输出一行。
Sample Input
3 3 1 2 1 2 3 1 3 1 1
Sample Output
YES
题解:就是判环,如果无环的话就求出树的直径,如果有环的话就输出YES,就可以了,记录一个最
长路,和次长路,就ok了。
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cmath> 5 #include<cstring> 6 #include<cstdlib> 7 #define N 100007 8 #define M 1000007 9 using namespace std; 10 11 int n,m,ans; 12 int cnt,head[N],Next[M*2],rea[M*2],val[M*2]; 13 int f[N][3],fa[N]; 14 bool vis[N]; 15 16 void Add(int u,int v,int fee){Next[++cnt]=head[u],head[u]=cnt,rea[cnt]=v,val[cnt]=fee;} 17 int find(int num) 18 { 19 if (fa[num]!=num) return fa[num]=find(fa[num]); 20 return fa[num]; 21 } 22 void dfs_solve(int u,int fa) 23 { 24 for (int i=head[u];i!=-1;i=Next[i]) 25 { 26 int v=rea[i],fee=val[i]; 27 if (v==fa||vis[v]) continue; 28 vis[v]=1;dfs_solve(v,u); 29 if (f[v][1]+fee>f[u][1]) 30 { 31 f[u][2]=f[u][1]; 32 f[u][1]=f[v][1]+fee; 33 } 34 else if (f[v][1]+fee>f[u][2]) f[u][2]=f[v][1]+fee; 35 } 36 ans=max(ans,f[u][1]+f[u][2]); 37 } 38 int main() 39 { 40 while (~scanf("%d%d",&n,&m)) 41 { 42 ans=cnt=0; 43 bool flag=0; 44 memset(vis,0,sizeof(vis)); 45 memset(head,-1,sizeof(head)); 46 memset(f,0,sizeof(f)); 47 for (int i=1;i<=n;i++) fa[i]=i; 48 for (int i=1,x,y,z;i<=m;i++) 49 { 50 scanf("%d%d%d",&x,&y,&z); 51 if (flag) continue; 52 int u=find(x),v=find(y); 53 if (u==v) 54 { 55 flag=1; 56 printf("YES\n"); 57 } 58 else fa[u]=v; 59 Add(x,y,z),Add(y,x,z); 60 } 61 if (flag) continue; 62 ans=-1; 63 for (int i=1;i<=n;i++) 64 { 65 if (!vis[i]) 66 { 67 vis[i]=1; 68 dfs_solve(i,-1); 69 } 70 } 71 printf("%d\n",ans); 72 } 73 }
标签:dfs 杭州 hdu sizeof 不能 最好 pre next 多少
原文地址:http://www.cnblogs.com/fengzhiyuan/p/7701017.html