FZU 2195 思维
很无聊的背景故事...求最短的时间原来就是省去了检查员最后上山的时间...还让不让人回家了...
感觉这是个最短路
思想是求出来dis 然后求里面最大的那条边 用总长减去最长边 就是答案
写了一个小时...dij用的还是有些不熟练 还出现了初始化dis[0]==1这种卖萌的行为
最后千辛万苦debug结束后发现...超时了...
我还是要放上来纪念这段思想...算法是没错的...虽然很长也很耗时间...但这是我第一次用vector写dij...还是独立...
#define INF 1000500000
int dis[100000];
bool book[100000];
struct node
{
int b;
int w;
};
int n;
int main(){
while(~scanf("%d",&n))
{
int zong=0;
for(int i=1;i<=n;i++)
{
dis[i]=INF; }
memset(book,true,sizeof(book));
dis[1]=0;
book[1]=false;
vector<node >a[n+1];
int q,e,r;
for(int i=1;i<=n-1;i++)
{
scanf("%d%d%d",&q,&e,&r);
node t;
t.b=e;
t.w=r;
a[q].push_back(t);
t.b=q;
a[e].push_back(t);
zong+=r;
}
for(int i=1;i<=n-1;i++)
{
int e=a[1].size();
int minn=INF;
int wh=1;
for(int k=1;k<=n;k++)
{
if(dis[k]<minn&&book[k]==true)
{
minn=dis[k];
wh=k;
}
}
book[wh]=false; int ee=a[wh].size(); for(int k=0;k<ee;k++)
{ if(dis[a[wh][k].b]>dis[wh]+a[wh][k].w&&book[a[wh][k].b]==true)
{
dis[a[wh][k].b]=dis[wh]+a[wh][k].w; }
}
}
int ans=0;
for(int i=2;i<=n;i++)
{
if(dis[i]>ans&&dis[i]<1000005000)
{
ans=dis[i];
}
}
for(int i=1;i<=n;i++)
{
printf("%d ",dis[i]);
}
puts(""); printf("%d\n",zong-ans);
}
}
然后接受了学妹神奇的思想 : x 是y的父节点。dy=dx+1
很简单的就想到排序后直接算了
由于排序方法是这样的 那么当我们算到3->5这条边的时候 3一定已经作为目标被行为过了 所以一开始对dis数组只需要初始化dis[1]为0即可 肯定不会出现3还没有dis值得情况
然而还是wa了.. 有些莫名
struct node
{
int a,b,w;
};
int dis[100050];
int cmp(node a,node b)
{
if(a.a==b.a)
return a.b<b.b;
else return a.a<b.a;
}
int main(){
int n;
while(~scanf("%d",&n))
{
int zong=0;
dis[1]=0;
node q[n-1];
for(int i=0;i<n-1;i++)
{
scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].w);
zong+=q[i].w;
}
sort(q,q+n-1,cmp);
int maxx=0;
for(int i=0;i<n-1;i++)
{
dis[q[i].b]=dis[q[i].a]+q[i].w;
}
for(int i=1;i<=n;i++)
{
if(dis[i]>maxx)
maxx=dis[i];
}
zong-=maxx;
printf("%d\n",zong); }
}
后来我就去看百度了..忽然发现了fa数组的用处..
于是循环找父节点相加就写出来了...
time数组代表的是当前节点的时间 因为它是一棵树所以当前节点时间唯一
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
using namespace std;
int fa[100050];
int time[100050];
int find(int x)
{
int sum=0;
while(x)
{
sum+=time[x];
x=fa[x];
}
return sum;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int zong=0;
memset(fa,0,sizeof(fa));
int q,e,w;
for(int i=1;i<=n-1;i++)
{
scanf("%d%d%d",&q,&e,&w);
zong+=w;
time[e]=w;
fa[e]=q;
}
int maxx=0;
for(int i=2;i<=n;i++)
{
int sum=find(i);
if(sum>maxx)
maxx=sum;
}
zong-=maxx;
printf("%d\n",zong);
} }
将近两个小时过去了...
FZU 2195 思维的更多相关文章
- FZU 2195 检查站点
求出根节点到每个叶子节点的距离,找到最大的.然后总权值减去最大叶子距离就是答案. GNU C++ AC Visual C++ TLE #include<stdio.h> #include ...
- FZU Problem 2214 Knapsack problem(背包+思维转换)
转化思维,把价值当成背包容量,选择最小的花费,从上到下枚举,找到当这个最小的花费. #include<iostream> #include<cstring> #include& ...
- L - Tic-Tac-Toe FZU - 2283 (思维)
题目链接: L - Tic-Tac-Toe FZU - 2283 题目大意:两个人下棋,一共是三步棋,第一个人下一步,第二个人下一步,第三个人下一步,然后问你在两个人在都足够聪明的条件下,第一个人能否 ...
- fzu 2250 不可能弹幕结界 分析+模拟,考察思维严谨。
Problem 2250 不可能弹幕结界 Accept: 5 Submit: 13Time Limit: 1000 mSec Memory Limit : 65536 KB Problem ...
- FZU 2202——犯罪嫌疑人——————【思维题】
犯罪嫌疑人 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- fzu月赛(2015.11)(思维)
Problem 2205 据说题目很水 Sunday最近对图论特别感兴趣,什么欧拉回路什么哈密顿回路,又是环又是树.在看完一本书后,他对自己特别有信心,便找到大牛牛犇犇,希望他出一题来考考自己. 在遥 ...
- FZU 2297 Number theory【线段树/单点更新/思维】
Given a integers x = 1, you have to apply Q (Q ≤ 100000) operations: Multiply, Divide. Input First l ...
- FZU - 2214 Knapsack problem 01背包逆思维
Knapsack problem Given a set of n items, each with a weight w[i] and a value v[i], determine a way t ...
- FZU - 2038 -E - Another Postman Problem (思维+递归+回溯)
Chinese Postman Problem is a very famous hard problem in graph theory. The problem is to find a shor ...
随机推荐
- github优秀开源项目大全-iOS
github优秀开源项目大全-iOS APR 25TH, 2014 前言 本文旨在搜集github上优秀的开源项目 本文搜集的项目都是用于iOS开发 本文会持续更新… 完整客户端 ioctocat g ...
- 爱情之路(codevs 2070)
题目描述 Description yh非常想念他的女朋友小y,于是他决定前往小y所在的那块大陆. 小y所在的大陆共有n个城市,m条双向路,每条路连接一个或两个城市.经过一条路ei需要耗费时间ti.此外 ...
- int *p()与int (*p)()的区别
int *p()是返回指针的函数 int (*p)()是指向函数的指针 返回指针的函数: int *a(int x,int y); 有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号 ...
- Android下利用Bitmap切割图片
在自己自定义的一个组件中由于需要用图片显示数字编号,而当前图片就只有一张,上面有0-9是个数字,于是不得不考虑将其中一个个的数字切割下来,需要显示什么数字,只需要组合一下就好了. 下面是程序的关键代码 ...
- Android之canvas详解
首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...
- $GLOBALS['HTTP_RAW_POST_DATA'] 和$_POST的区别
$_POST:通过 HTTP POST 方法传递的变量组成的数组.是自动全局变量. $GLOBALS['HTTP_RAW_POST_DATA'] :总是产生 $HTTP_RAW_POST_DATA 变 ...
- Java程序员最常用的8个Java日志框架
转自:http://www.codeceo.com/article/8-java-log-framework.html 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用 ...
- Java中的Timer和TimerTask在Android中的用法(转)
转自:http://blog.csdn.net/zuolongsnail/article/details/8168689 在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务.比如UI ...
- ML 04、模型评估与模型选择
机器学习算法 原理.实现与实践——模型评估与模型选择 1. 训练误差与测试误差 机器学习的目的是使学习到的模型不仅对已知数据而且对未知数据都能有很好的预测能力. 假设学习到的模型是$Y = \hat{ ...
- loj 1154(最大流+枚举汇点)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26868 思路:拆点,容量为最多能跳的步数,然后设立一个超级源点,源 ...