1. 程式人生 > >洛谷——P1294 高手去散步

洛谷——P1294 高手去散步

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 高手去散步