1509: [NOI2003]逃学的小孩
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 968 Solved: 489
[Submit][Status][Discuss]
Description
Input
第一行是两个整数N(3 N 200000)和M,分别表示居住点总数和街道总数。以下M行,每行给出一条街道的信息。第i+1行包含整数Ui、Vi、Ti(1Ui, Vi N,1 Ti 1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟。街道信息不会重复给出。
Output
仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris。
Sample Input
4 3
1 2 1
2 3 1
3 4 1
Sample Output
4
AC代码:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
struct node
{
int date=0;
int from=0;
};
#define maxn 100003
vector<pair<int,int>>maps[maxn];
node ma[maxn][4];
int vis[maxn];
int n,m;
int dp[maxn];
long long ans=0;
bool cmp(node a,node b)
{
return a.date>b.date;
}
void dfs1(int x)
{
vis[x]=1;
for(int i=0;i<maps[x].size();++i)
{
int to=maps[x][i].first;
int weight=maps[x][i].second;
if(vis[to]==0)
{
dfs1(to);
ma[x][3].date=ma[to][0].date+weight;
ma[x][3].from=to;
sort(ma[x],ma[x]+4,cmp);
ans=max(ans,(long long)(ma[x][0].date+2*ma[x][1].date+ma[x][2].date));
}
}
}
void dfs2(int x)
{
vis[x]=1;
for(int i=0;i<maps[x].size();++i)
{
int to=maps[x][i].first;
int weight=maps[x][i].second;
if(vis[to]==1)
{
if(ma[to][0].from!=x)
ma[x][3].date=ma[to][0].date+weight;
else
ma[x][3].date=ma[to][1].date+weight;
ma[x][3].from=to;
sort(ma[x],ma[x]+4,cmp);
ans=max(ans,(long long)(ma[x][0].date+2*ma[x][1].date+ma[x][2].date));
break;
}
}
for(int i=0;i<maps[x].size();++i)
{
int to=maps[x][i].first;
int weight=maps[x][i].second;
if(vis[to]==0)
dfs2(to);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;++i)
{
int a,b,c;
cin>>a>>b>>c;
maps[a].push_back(make_pair(b,c));
maps[b].push_back(make_pair(a,c));
}
memset(vis,0,sizeof(vis));
memset(ma,0,sizeof(ma));
dfs1(1);
memset(vis,0,sizeof(vis));
dfs2(1);
cout<<ans<<endl;
return 0;
}