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 ...
随机推荐
- CSS-Transform-transition-Animation
Transform 根据我的理解,transform和width.height.background一样,都是dom的属性,不同的是它是css3旗下的,比较屌,能够对原来的dom元素进行移动.缩放.转 ...
- Maximum sum(poj 2479)
题意:给一段数列,将这个数列分成两部分,使两部分的最大子段和的和最大,输出和 /* 看数据没想到是(O)n的算法,求出从前向后的最大子段和和从后向前的最大子段和, 然后枚举断点. 第一次提交不小心折在 ...
- C++基础(1)
1.关于继承及访问. C++中 public,protected, private 访问标号小结,即访问标号使用限制. 第一:private, public, protected 访问标号的访问范围. ...
- linux tricks 之 container_of.
转载:http://blog.chinaunix.net/uid-20608849-id-3027972.html 由于内核中定义了很多复杂的数据结构,而它们的实例中的成员在作为函数参数传递的时,函数 ...
- Xamarin.Android开发实践(六)
Xamarin.Android通知详解 一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android ...
- wp8 导航方法
全局跳转 (App.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/Tools/SpatialQueryCha ...
- android 拨号
public class CallActivity extends Activity { @Override public void onCreate(Bundle savedInstanceStat ...
- linux下验证码无法显示:Could not initialize class sun.awt.X1 解决方案
转自:http://my.oschina.net/xiangtao/blog/28441 网站验证码突然无法显示,并报如下错误. Caused by: java.lang.NoClassDefFoun ...
- 关于hive的str_to_map
我之前用的是有问题的... 应该是这样用: str_to_map('a=b c=d f=e',' ','=') 这样就会拆成map,等号前面是key,后面是value
- MBR 基础
1.简介 MBR,全称为Master Boot Record,即硬盘的主引导记录,它位于整个硬盘的0磁道0柱面1扇区,其主要对硬盘进行了组织,是在驱动器最前端的一段引导扇区. MBR是不属于任何一个操 ...