湫湫系列故事——設計風景線 
 Time Limit: 6000/3000 MS (Java/Others) 
 Memory Limit: 65535/32768 K (Java/Others) 
 Total Submission(s): 4000 
 Accepted Submission(s): 715 
 Problem Description 
   隨著杭州西湖的知名度的進一步提升,園林規劃專家湫湫希望設計出一條新的經典觀光線路,根據老板馬小騰的指示,新的風景線最好能建成環形,如果沒有條件建成環形,那就建的越長越好。 
   現在已經勘探確定了n個位置可以用來建設,在它們之間也勘探確定了m條可以設計的路線以及他們的長度。請問是否能夠建成環形的風景線?如果不能,風景線最長能夠達到多少? 
   其中,可以興建的路線均是雙向的,他們之間的長度均大于0。 
 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 
 Source 
 2013騰訊編程馬拉松初賽第二場(3月22日) 
 Recommend 
 liuyiding
  
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define MAXN 100001
#define MAXM 1000001
using namespace std;
int head[MAXN],n,m,tot,dfn[MAXN],x[MAXN],y[MAXN],z[MAXN],maxtot,maxt,dis[MAXN];
bool b[MAXN];
struct data{
int v,next,x;
}e[MAXM];
int read(){
int x=
0,f=
1;
char ch=getchar();
while(ch<
'0'||ch>
'9') {
if(ch==
'-')f=-
1;ch=getchar();}
while(ch>=
'0'&&ch<=
'9') x=x*
10+ch-
48,ch=getchar();
return x*f;
}
void add(
int u,
int v,
int x){e[++tot].v=v;e[tot].x=x;e[tot].next=head[u];head[u]=tot;
}
bool check(){
queue<int>q;q.push(
1);b[
1]=
true;
while(!q.empty()){
int u=q.front();q.pop();
for(
int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(b[v])
return true;
else b[v]=
true,q.push(v);}}
return false;
}
int bfs(
int u){
memset(dis,-
1,
sizeof(dis));dis[u]=
0;
queue<int>q;q.push(u);
while(!q.empty()){
int u=q.front();q.pop();
for(
int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(dis[v]==-
1){dis[v]=dis[u]+e[i].x;q.push(v);
if(dis[v]>maxtot){maxtot=dis[v];maxt=v;}}}}
return maxt;
}
void slove(){maxtot=
0;
memset(b,
0,
sizeof(b));
if(check()) 
printf(
"YES\n");
else{
for(
int i=
1;i<=m;i++)add(y[i],x[i],z[i]);
int t=bfs(
1);bfs(t);
printf(
"%d\n",maxtot);}
}
int main()
{
while(
scanf(
"%d%d",&n,&m)!=EOF){
for(
int i=
1;i<=m;i++){tot=
0;x[i]=read();y[i]=read();z[i]=read();add(x[i],y[i],z[i]);}slove();}
return 0;
} 
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define MAXN 100001
#define MAXM 1000001
using namespace std;
int head[MAXN],n,m,tot,dfn[MAXN],maxtot,maxt,dis[MAXN],tmp[MAXN];
struct data{
int v,next,x;
}e[MAXM];
int read(){
int x=
0,f=
1;
char ch=getchar();
while(ch<
'0'||ch>
'9') {
if(ch==
'-')f=-
1;ch=getchar();}
while(ch>=
'0'&&ch<=
'9') x=x*
10+ch-
48,ch=getchar();
return x*f;
}
void add(
int u,
int v,
int x){e[++tot].v=v;e[tot].x=x;e[tot].next=head[u];head[u]=tot;
}
bool check(
int pre,
int u){dfn[u]=
true;
for(
int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(v==pre) 
continue;
if(dfn[v]) 
return true;dis[v]=dis[u]+e[i].x;
if(check(u,v)) 
return true;}
return false;
}
void slove(){maxtot=
0;
bool flag=
0;
memset(dfn,
0,
sizeof(dfn));
for(
int i=
1;i<=n;i++){
if(dfn[i]) 
continue;
if(check(
0,i)) {flag=
1;
printf(
"YES\n");
break;}
int u=max_element(dis+
1,dis+
1+n)-dis;  
memcpy(tmp,dfn,
sizeof(dfn)); 
memset(dfn,
false,
sizeof(dfn));  
memset(dis,
0,
sizeof(dis));check(
0,u);maxtot=max(maxtot,*max_element(dis+
1,dis+
1+n));
memcpy(dfn,tmp,
sizeof(dfn));}
if(flag) 
return ;
else printf(
"%d\n",maxtot);
}
int main()
{
int x,y,z;
while(~
scanf(
"%d%d",&n,&m)){tot=
0;
memset(head,
0,
sizeof(head));
for(
int i=
1;i<=m;i++){
scanf(
"%d%d%d",&x,&y,&z);add(x,y,z);add(y,x,z);}slove();}
return 0;
} 
 
轉載于:https://www.cnblogs.com/nancheng58/p/6070790.html
                            總結
                            
                                以上是生活随笔為你收集整理的Hdu 4514 湫湫系列故事——设计风景线的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。