题意不明坑死人。。 到底是最长路呢,还是一个最小生成树?
我只知道这个数据
4 3
1 2 1
1 3 1
1 4 3
用最长路求出来的是4, 最小生成树求出来的是5... 最坑爹的是两种都过了。。。
不过这次也还学到了一些东西, 就是给定的栈的大小很小,10^5的都没有, 所以这题如果要用dfs遍历树的话,要自己添加栈空间
#pragma comment(linker, "/STACK:102400000,102400000") //这个是好东西
其他就比较好求了...
最长路的代码
#pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define N 100100 #define M 10001000 int n,m; int bin[N]; int cnt,pre[N]; int mark[N]; int mx; struct node { int to,next,w; }edge[M]; void add_edge(int x,int y,int w) { edge[cnt].to=y; edge[cnt].w=w; edge[cnt].next=pre[x]; pre[x]=cnt++; } int find(int x) { int s=x; while(bin[s]!=s) s=bin[s]; while(bin[x]!=s) { int tmp=bin[x]; bin[x]=s; x=tmp; } return s; } int dfs(int s) { int fi=0,se=0; mark[s]=1; for(int p=pre[s];p!=-1;p=edge[p].next) { int v=edge[p].to; if( mark[v] == 0 ) { int tmp=dfs(v)+edge[p].w; if(tmp > fi) { fi=tmp; } else { if(tmp>se) se=tmp; } } } if(fi+se>mx) mx=fi+se; return fi; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { cnt=0; mx=-1; memset(pre,-1,sizeof(pre)); memset(mark,0,sizeof(mark)); for(int i=0;i<N;i++) bin[i]=i; int flag=0; for(int i=0;i<m;i++) { int x,y,key; scanf("%d%d%d",&x,&y,&key); int a=0,b=1; a=find(x); b=find(y); bin[a]=b; if(a==b) { flag=1; } add_edge(x,y,key); add_edge(y,x,key); } if(flag==1) { printf("YES\n"); continue; } for(int i=1;i<=n;i++) { if(mark[i]==0) { int tmp; tmp=dfs(i); } } printf("%d\n",mx); } return 0; }