题目背景
高手最近谈恋爱了。不过是单相思。“即使是单相思,也是完整的爱情”,高手从未放弃对它的追求。今天,这个阳光明媚的早晨,太阳从西边缓缓升起。于是她找到高手,希望在晨读开始之前和高手一起在鳌头山上一起散步。高手当然不会放弃这次梦寐以求的机会,他已经准备好了一切。
题目描述
鳌头山上有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,保证观景点两两之间不会有多条游步道连接.
分析:
本题由于起点不确定,故可以暴力枚举起点,然后对每个起点做dfs取最大值。
CODE:
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 const int M=1005; 8 int n,m,tot,nxt[M],head[M],to[M],adj[M],ans; 9 bool flag[M]; 10 inline int read(){ 11 char c=getchar();int ans=0; 12 while (c<'0'||c>'9') c=getchar(); 13 while (c>='0'&&c<='9') ans=(ans<<1)+(ans<<3)+(c^48),c=getchar(); 14 return ans; 15 } 16 int min(int u,int v){return u<v?u:v;} 17 int max(int u,int v){return u>v?u:v;} 18 void add(int u,int v,int w){ 19 nxt[++tot]=head[u];head[u]=tot; 20 to[tot]=v;adj[tot]=w; 21 return; 22 } 23 void dfs(int x,int now){ 24 ans=max(ans,now); 25 flag[x]=1; 26 for (int i=head[x];i;i=nxt[i]) 27 if (!flag[to[i]]) dfs(to[i],now+adj[i]); 28 flag[x]=0; 29 return; 30 } 31 int main(){ 32 n=read(),m=read(); 33 for (int i=1,u,v,w;i<=m;i++){ 34 u=read(),v=read(),w=read(); 35 add(u,v,w);add(v,u,w); 36 } 37 for (int i=1;i<=n;i++) dfs(i,0); 38 printf("%d",ans); 39 return 0; 40 }