比赛 20161115 评测结果 AWWWAAWWWWWWWWWWWWWW
题目名称 树和机器人 最终得分 15
用户昵称 srO cwm Orz 运行时间 0.181 s
代码语言 C++ 内存使用 0.94 MiB
提交时间 2016-11-15 11:40:34
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;

const int maxn = 50010;
const int oo = 1<<30;
struct Edge{
	int from,to,dist;
};	
vector<int> G[maxn];
vector<Edge> edges;
bool vis[maxn];
int ans=oo;
int n,k,r;

void addEdge(int u,int v,int w){
	edges.push_back((Edge){u,v,w});
	edges.push_back((Edge){u,v,w});
	int m = edges.size();
	G[u].push_back(m-2);
	G[v].push_back(m-1);
}
bool check(){
	for(int i = 1; i < n; i++)if(!vis[i])return 0;
	return 1;
}
void dfs1(int o,int v,int d){
	if(v > ans)return;
	if(check()){
		ans = min(v,ans);
		return;
	}
	for(int i = 0; i < G[o].size(); i++){
		Edge& e = edges[G[o][i]];
		if(!vis[e.to]){
			vis[e.to]=1;
			dfs1(i,v+e.dist,d+1);
			vis[e.to]=0;
		}
	}
}
int main(){
	#ifndef DEBUG
		string FileName="trobot";
		freopen((FileName+".in").c_str(),"r",stdin);
		freopen((FileName+".out").c_str(),"w",stdout);
	#endif
	scanf("%d%d%d",&n,&r,&k);
	int flag1(1);
	int sum=0;
	for(int i = 0; i < n-1; i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		if(v!=1)flag1=0;
		sum += w;
		addEdge(u,v,w);
	}
	if(k == 1){
		dfs1(r,0,0);
		printf("%d\n",ans);
	}
	else{
		printf("%d",sum);
	}
}