1528. 小天狼星的访问
Description
经过数月的准备,小天狼星,一个被诬陷的杀人犯,准备闯入霍格沃茨见见他的侄子。霍格沃茨的地图呈一颗树状分布。每个房间由若干跳过道通向其他房间。由于小天狼星想尽快找到哈利:
-
他会从房间0开始找
-
他总是会选择离自己最近的房间找,如果仍有多个房间,从序号最小的开始找。
-
如果没找到,则继续选最近的房间深入。
-
如果已没有房间可走,则返回到上一个房间,继续选择(往回走也算时间哦)。
-
当然,除了往回走,小天狼星是不会去一个房间两次的。
Input Format
第1行:n,p,n表示房间个数,p表示哈利所在的房间。
第2 - n行:s,t,l,表示从房间s到房间t的时间为l(0 <= s < t < n)。
Output Format
1行:找到哈利的时间(开始时间为0)。
Sample Input
5 2
0 1 1
0 2 2
1 3 3
1 4 4
Sample Output
18
Hint
对40%的数据:0 < p <= n < 1000。
对100%的数据:0 < p <= n < 100000。
对100%的数据:0 < l <= 2^31-1。
如题。
大体上就是DFS吧。应该也用不到什么多高深的技巧。
我代码里面是首先排序来着。因为感觉要求并不是很高。简单的排了一下就AC了.
没有能一次ac的主要原因在于对100%的数据:0 < l <= 2^31-1。
也就是说int需要改成long long才对。
#include <iostream>
#include <fstream>
#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;
#define lop(n,i) for(int i=0;i<n;i++)
#define ci(t) (cin>>t)
#define co(t) (cout<<t)
struct elem
{
int n;
long long t;
elem(int num1=-1,int num2=-1):n(num1),t(num2)
{
}
};
struct Node
{
vector<elem>no;
long long nt;
Node ()
{
nt=0;
}
//time now
};
Node s[100009];
int n,p;
void dfs(int x,int e)
{
//cout<<"x is: "<<x<<" time is: "<<s[x].nt<<endl;
if(x==e)
{
cout<<s[x].nt<<endl;
exit(0);
}
if (s[x].no.size()==0)return;
for (int i=0;i<s[x].no.size();i++)
{
s[s[x].no[i].n].nt+=(s[x].no[i].t+s[x].nt);
dfs(s[x].no[i].n,e);
s[x].nt=(s[x].no[i].t+s[s[x].no[i].n].nt);
}
}
int main()
{
cin>>n>>p;
int fi,se;
long long tt;
lop(n-1,i)
{
cin>>fi>>se>>tt;
s[fi].no.push_back(elem(se,tt));
}
lop(n,i)
{
if (s[i].no.size()==0)continue;//....
else
{
for (int k=0;k<s[i].no.size();k++)
{
for (int j=k+1;j<s[i].no.size();j++)
{
if (s[i].no[k].t>s[i].no[j].t)
{
swap(s[i].no[k],s[i].no[j]);
}
else if (s[i].no[k].t==s[i].no[j].t&&s[i].no[k].n>s[i].no[j].n){
swap(s[i].no[k],s[i].no[j]);
}
}
}
}
}
dfs(0,p);
//system("pause");
return 0;
}
没有用快排和堆排也过了。注意一下输入输出和边界的问题。