Traveler Nobita


Time Limit: 2 Seconds      Memory Limit: 65536 KB


One day, Nobita used a time machine and went back to 1000 AD. He found that there are N cities in the kingdom he lived. The cities are numbered from 0 toN - 1. Before
1000 AD., there are no roads between any two cities. The kingdom will build one road between two cities at the beginning of each year starting from 1000 AD. There might be duplicated roads between two cities being built by the kingdom. You can assume that
building a road takes no time.

At the beginning of every year, after the new road is built, Nobita will try to make a schedule to travel around all cities within that year. The travel should both begin at and end at
the capital city - city0. Every time Nobita arrived at a city i, he will spent t1i days in that city, regardless of how many times he had come to the city. Of course he wouldn't need to spend any time in the
capital city (that is to say, t10 is always 0). And t2i hours is required to pass road #i. Note that to pass each road, a passport of that road is required. And the kingdom limits that one
person can only have no more than N - 1 passports of roads each year.

You are given information about the roads built in M years. Please find out the minimum time Nobita needed to complete his traveling schedule.

Input

There are multiple cases. The first line of a test case contains two integers, N (2 ≤ N ≤ 200) and M (1 ≤ M ≤ 10000). The next line contains N integers,
indicating t10 ... t1n - 1. (0 ≤ t1i ≤ 50) The next M lines, the ith (0 ≤ i < M) line of this section contains three integers, ui, vi, t2i,
(0 ≤ ui, vi < N; 0 ≤ t2i ≤ 5000), indicating that in year 1000 + i AD., a road will be built between city ui and city vi. t1i and t2i have
been described above.

Output

For each case, you should output M lines. For the ith line, if Nobita can make a schedule in year 1000 + i, output the minimal days he can finish
that schedule, rounded to two decimal digits. Otherwise output -1. There should be a blank line after each case.

Sample Input

5 6
0 5 2 5 4
0 1 1
0 2 2
0 3 5
3 4 2
2 4 4
1 2 1

Sample Output

-1
-1
-1
21.83
19.00
19.00

题意:有n个城市。每年修一条路,总共修m年。注意是从1000年開始的。Nobita想要每年走完一次n个城市,每次从0号出发,最后再回到0号,在每一个城市待t1天。从一个城市到还有一个城市要t2小时,注意这里的时间单位不统一。推断年份时,也要注意闰年和平年

思路:kruscal就可以找到最短的路线。对于u,v两个点之间的边权,存的是在u,v两个城市呆的时间和行走路程所用时间。在0号不须要花费时间。

kruscal过程中有一个优化。即假设两个点已经是一个集合中的,那么连接这两点的边就能够删除。由于之前已经有花费更少的边了,所以这条边。就是没用的。
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#define N 10009
using namespace std; int n,m;
int num;
int a[N];
int fa[N]; struct node
{
int u,v,len;
bool operator<(const node &a)const
{
return len<a.len;
}
};
vector<node>ed; int findfa(int x)
{
int r = x, t; while(r!=fa[r])
r=fa[r]; // for(;fa[r]>=0;r=fa[r]); while(x!=r)
{
t = fa[x];
fa[x] = r;
x = t;
} return r;
} int check(int x)
{
if(x%400==0 || (x%4==0&&x%100))
return 1; return 0;
} void add(int u,int v,int w)
{
node e={u,v,(a[u]+a[v])*24+w*2};
ed.push_back(e);
} void uniontwo(int a,int b)
{
int aa=findfa(a);
int bb=findfa(b);
int tmp=fa[aa]+fa[bb];
if(fa[aa]>fa[bb])
{
fa[aa]=bb;
fa[bb]=tmp;
}
else
{
fa[bb]=aa;
fa[aa]=tmp;
}
} int kruscal()
{
for(int i=1;i<=n;i++)fa[i]=i; sort(ed.begin(),ed.end());
int ans=0,cnt=0; // for(vector<node>::iterator it=ed.begin();it!=ed.end();it++)
// {
// cout<<it->u<<" "<<it->v<<" "<<it->len<<endl;
// } for(vector<node>::iterator it=ed.begin();it<ed.end();)
{
int u=it->u;
int v=it->v;
int l=it->len;
int fu=findfa(u);
int fv=findfa(v); if( findfa(u)!=findfa(v) )
{
ans+=l;
cnt++;
it++;
if(fv>fu)fa[fv]=fu;
else
fa[fu]=fv;
//uniontwo(u,v);
}
else
ed.erase(it);//已经有更小的边用于连接,此边即没什么用。可删除
}
//cout<<"cnt="<<cnt<<endl; if(cnt<n-1) return -1;
return ans; } int main()
{
while(~scanf("%d%d",&n,&m))
{
num=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]); ed.clear();
int u,v,w; for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w); if(i<n-2)
{
puts("-1");
continue;
} int x=kruscal();
//cout<<"********"<<endl; //cout<<"x="<<x<<endl;
if(x==-1)
{
puts("-1");
continue;
}
int yy;
if(check(1000+i)) yy=366;
else yy=365; if(yy*24<x)
puts("-1");
else
printf("%.2f\n",x/24.0); }
puts(""); } return 0;
}


ZOJ 3456 Traveler Nobita 最小生成树的更多相关文章

  1. Traveler Nobita (zoj 3456 最小生成树)

    Traveler Nobita Time Limit: 2 Seconds      Memory Limit: 65536 KB One day, Nobita used a time machin ...

  2. ZOJ - 3204 Connect them 最小生成树

    Connect them ZOJ - 3204 You have n computers numbered from 1 to n and you want to connect them to ma ...

  3. ZOJ 1586 QS Network (最小生成树)

    QS Network Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Sta ...

  4. POJ 1861 &amp; ZOJ 1542 Network(最小生成树之Krusal)

    题目链接: PKU:http://poj.org/problem?id=1861 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  5. ZOJ 1542 POJ 1861 Network 网络 最小生成树,求最长边,Kruskal算法

    题目连接:problemId=542" target="_blank">ZOJ 1542 POJ 1861 Network 网络 Network Time Limi ...

  6. ZOJ 1203 Swordfish 旗鱼 最小生成树,Kruskal算法

    主题链接:problemId=203" target="_blank">ZOJ 1203 Swordfish 旗鱼 Swordfish Time Limit: 2 ...

  7. ZOJ 1584:Sunny Cup 2003 - Preliminary Round(最小生成树&amp;&amp;prim)

    Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the planet w-5 ...

  8. zoj 3204 最小生成树,输出字典序最小的解

    注意排序即可 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring ...

  9. zoj 2966 Build The Electric System 最小生成树

    Escape Time II Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showP ...

随机推荐

  1. Word中如何从某一页重新开始页码

  2. Redis源代码分析(三十三)--- redis-cli.cclient命令行接口的实现(2)

    今天学习完了命令行client的兴许内容,总体感觉就是环绕着2个东西转,config和mode.为什么我会这么说呢,请继续往下看,client中的配置结构体和之前我们所学习的配置结构体,不是指的同一个 ...

  3. 集群服务器下使用SpringBoot @Scheduled注解定时任务

    原文:https://blog.csdn.net/huyang1990/article/details/78551578 SpringBoot提供了 Schedule模块完美支持定时任务的执行 在实际 ...

  4. C#使用ProtocolBuffer(ProtoBuf)进行Unity中的Socket通信

    首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Uni ...

  5. cvCreateStumpClassifier

    CV_BOOST_IMPL CvClassifier* cvCreateStumpClassifier( CvMat* trainData, //训练样本的数据,包含图像大小.数量,类别,权重等 in ...

  6. intellij idea 无法启动或调试 spring-boot

    解决方案一: 原因是因为Working directory没有指定, 并且运行前要手动执行mvn clean install命令才可以.所以导致错误了.希望大家不要犯类似错误. 解决方式二: 看看你的 ...

  7. 斯巴达克斯诅咒者之战第三季/全集Spartacus迅雷下载

    本季Spartacus 3第三季(2013)看点:<斯巴达克斯>系列是美国Starz电视网历史上的首部原创作品,凭借其重口味的流血镜头.香艳的画面.血腥的打斗场面和优良的制作一经推出就瞬间 ...

  8. Android5.0新控件RecyclerVIew的介绍和兼容使用的方法

    第一部分 RecyclerVIew是一个可以替代listview和Gallery的有效空间而且在support-v7中有了低版本支持,具体使用方式还是规规矩矩的适配器加控件模式.我们先来看看官网的介绍 ...

  9. 用自定义的RoundImageView来实现圆形图片(可加边框)

    本文的控件来自:http://blog.csdn.net/alan_biao/article/details/17379925 这个控件不同于之前介绍过的那个框架,这个仅仅能过将图片裁剪为圆形,没能弄 ...

  10. JavaScript 中的异常处理

    考虑到 JS 中的错误可比服务器端的代码产生的错误要多得多,并且还难以发现及修正,所以 JS 代码必须有异常处理以及全局一场处理. try { //这段代码从上往下运行,其中任何一个语句抛出异常该代码 ...