ZOJ 3456 Traveler Nobita 最小生成树
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 最小生成树的更多相关文章
- Traveler Nobita (zoj 3456 最小生成树)
Traveler Nobita Time Limit: 2 Seconds Memory Limit: 65536 KB One day, Nobita used a time machin ...
- 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 ...
- ZOJ 1586 QS Network (最小生成树)
QS Network Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit Sta ...
- POJ 1861 & ZOJ 1542 Network(最小生成树之Krusal)
题目链接: PKU:http://poj.org/problem?id=1861 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...
- ZOJ 1542 POJ 1861 Network 网络 最小生成树,求最长边,Kruskal算法
题目连接:problemId=542" target="_blank">ZOJ 1542 POJ 1861 Network 网络 Network Time Limi ...
- ZOJ 1203 Swordfish 旗鱼 最小生成树,Kruskal算法
主题链接:problemId=203" target="_blank">ZOJ 1203 Swordfish 旗鱼 Swordfish Time Limit: 2 ...
- ZOJ 1584:Sunny Cup 2003 - Preliminary Round(最小生成树&&prim)
Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the planet w-5 ...
- zoj 3204 最小生成树,输出字典序最小的解
注意排序即可 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring ...
- zoj 2966 Build The Electric System 最小生成树
Escape Time II Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showP ...
随机推荐
- Go内置库模块 flag
import "flag" flag包实现了命令行参数的解析.每个参数认为一条记录,根据实际进行定义,到一个set集合.每条都有各自的状态参数. 在使用flag时正常流程: 1. ...
- TCP套接字端口复用SO_REUSEADDR
下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...
- 在简历中使用STAR法则
一.什么是STAR法则? The STAR (Situation, Task, Action, Result) format is a job interview technique used by ...
- 我所经历的SAP选型[转]
这是一个失败的选型项目,而且在可遇见的未来公司也不会再经历SAP选型,甚至不会再启动erp项目,个中原因很难一言道尽,在此简要的说说我们的选型过程以及在选型过程中对各种因素的考虑. 一.重启选型工作七 ...
- C#编程(十三)----------方法重载
C#支持方法的重载---方法的几个版本有不同的签名即可(即,方法名相同,但是参数个数和/或类型不同).为了冲在方法,只需要声明同名单参数个数或类型不同的方法即可. 注意:两个方法不能仅在返回类型上有区 ...
- android Installation error: INSTALL_FAILED_VERSION_DOWNGRADE
http://www.apkbus.com/android-114019-1-1.html 提高 AndroidManifest.xml中的manifest的android:versionCode ...
- WordPress主题开发:数据调用
记录在开发过程中常用的 引入标签:在一个模板文件里引用另外一个文件 get_header() get_footer() get_sidebar() get_template_part() get_se ...
- 常见排序的JAVA实现和性能测试
五种常见的排序算法实现 算法描述 1.插入排序 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重 ...
- Asp.Net Core MVC控制器和视图之间传值
一.Core MVC中控制器和视图之间传值方式和Asp.Net中非常类似 1.弱类型数据:ViewData,ViewBag 2.强类型数据:@model 二.代码 实例 1.ViewData pub ...
- spring学习之@SessionAttributes
一.@ModelAttribute 在默认情况下,ModelMap 中的属性作用域是 request 级别是,也就是说,当本次请求结束后,ModelMap 中的属性将销毁.如果希望在多个请求中共享 M ...