洛谷——P1294 高手去散步
阿新 • • 發佈:2017-09-24
for 信息 images mem i++ 在一起 fin 一次 mes
P1294 高手去散步
題目背景
高手最近談戀愛了。不過是單相思。“即使是單相思,也是完整的愛情”,高手從未放棄對它的追求。今天,這個陽光明媚的早晨,太陽從西邊緩緩升起。於是它找到高手,希望在晨讀開始之前和高手一起在鰲頭山上一起散步。高手當然不會放棄這次夢寐以求的機會,他已經準備好了一切。
題目描述
鰲頭山上有n個觀景點,觀景點兩兩之間有遊步道共m條。高手的那個它,不喜歡太刺激的過程,因此那些沒有路的觀景點高手是不會選擇去的。另外,她也不喜歡去同一個觀景點一次以上。而高手想讓他們在一起的路程最長(觀景時它不會理高手),已知高手的穿梭機可以讓他們在任意一個觀景點出發,也在任意一個觀景點結束。
輸入輸出格式
輸入格式:
第一行,兩個用空格隔開的整數n、m. 之後m行,為每條遊步道的信息:兩端觀景點編號、長度。
輸出格式:
一個整數,表示他們最長相伴的路程。
輸入輸出樣例
輸入樣例#1:4 6 1 2 10 2 3 20 3 4 30 4 1 40 1 3 50 2 4 60輸出樣例#1:
150
說明
對於100%的數據:n≤20,m≤50,保證觀景點兩兩之間不會有多條遊步道連接.
欲求數的直徑,結果繞起圈圈了、、
#include<cstdio> #include<cstring> #include樹的直徑(顯然不對)<iostream> #include<algorithm> #define N 110 using namespace std; bool vis[N],vist[N]; int n,m,x,y,z,ans,tot,root,fa[N],dis[N],head[N]; 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-‘0‘; ch=getchar();} return x*f; } struct Edge { int to,dis,next,from; }edge[N]; int add(int x,int y,int z) { tot++; edge[tot].to=y; edge[tot].dis=z; edge[tot].next=head[x]; head[x]=tot; } int dfs(int x) { vist[x]=true; for(int i=head[x];i;i=edge[i].next) { int to=edge[i].to; if(vis[to]||fa[x]==to) continue; vis[to]=true;fa[to]=x; dis[to]=dis[x]+edge[i].dis; dfs(to); vis[to]=false; } } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { x=read(),y=read(),z=read(); add(x,y,z),add(y,x,z); } for(int i=1;i<=n;i++) { if(vist[i]) continue; memset(dis,0,sizeof(dis)); dfs(i);root=i; for(int i=1;i<=n;i++) if(dis[i]>dis[root]) root=i; memset(dis,0,sizeof(dis)); dfs(root); for(int i=1;i<=n;i++) if(ans<dis[i]) ans=dis[i]; } printf("%d",ans); return 0; }
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 110 using namespace std; bool vis[N]; int n,m,x,y,z,ans,tot,head[N]; 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-‘0‘; ch=getchar();} return x*f; } struct Edge { int to,dis,next,from; }edge[N]; int add(int x,int y,int z) { tot++; edge[tot].to=y; edge[tot].dis=z; edge[tot].next=head[x]; head[x]=tot; } int dfs(int x) { if(vis[x]) return 0; vis[x]=true; int sum=0; for(int i=head[x];i;i=edge[i].next) { int to=edge[i].to; if(!vis[to]) sum=max(sum,dfs(to)+edge[i].dis); } vis[x]=false; return sum; } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { x=read(),y=read(),z=read(); add(x,y,z),add(y,x,z); } for(int i=1;i<=n;i++) { if(vis[i]) continue; ans=max(ans,dfs(i)); } printf("%d",ans); return 0; }
縱使知道會一敗塗地,縱使知道結果會不盡人意,我仍然選擇傾盡全力,直到被傷的體無完膚,只圖無怨無悔
洛谷——P1294 高手去散步