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 to
N
- 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条路,開始没有路。每一年修一条路。修完后一个人从0点周游这n个点。问是否能在一年内游玩这n个点,能的话输出最少的天数。输入会告诉每一个点他待的时间和每条路走的时间,他最多仅仅能走n-1条路。

思路:一边加边一边Kruskal,每次Kruskal把没实用的边删掉,另外前n-2年肯定不能完毕。还要注意闰年。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 2005
#define MAXN 20025
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b) for(i = a; i < b; i++)
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define DBG pf("Hi\n")
typedef long long ll;
using namespace std; struct Edge
{
int u,v,len;
bool operator<(const Edge &a)const
{
return len<a.len;
}
}; vector<Edge>edge;
int father[maxn];
int a[maxn];
bool vis[maxn];
int num=0;
int n,m; void init()
{
num=0;
edge.clear();
} void addedge(int u,int v,int w,int id)
{
Edge e={u,v,(a[u]+a[v])*24+w*2};
edge.push_back(e);
} int find_father(int x)
{
if (x!=father[x])
father[x]=find_father(father[x]);
return father[x];
} int Kruskal()
{
int i,j;
for (i=0;i<n;i++) father[i]=i;
sort(edge.begin(),edge.end());
int cnt=0,ans=0;
for (vector<Edge>::iterator it = edge.begin();it!=edge.end();)
{
int u=it->u;
int v=it->v;
int l=it->len;
int fu=find_father(u);
int fv=find_father(v);
if (fu!=fv)
{
ans+=l;
it++;
cnt++;
father[fu]=fv;
}
else
edge.erase(it);
// if (cnt==n-1) break; //不要break。要把后面无关的边删掉,不然sort会耗时
}
if (cnt<n-1) return -1;
return ans;
} bool isok(int x)
{
if ((x%4==0&&x%100)||x%400==0) return true;
return false;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("C:/Users/asus1/Desktop/IN.txt","r",stdin);
#endif
int i,j;
while (~sff(n,m))
{
init();
for (i=0;i<n;i++)
sf(a[i]);
int u,v,w;
for (i=0;i<m;i++)
{
sfff(u,v,w);
addedge(u,v,w,i);
int x=Kruskal();
if (x==-1) {
pf("-1\n");
continue;
}
int yy;
if (isok(1000+i)) yy=366;
else yy=365;
if (yy*24<x){
pf("-1\n");
continue;
}
pf("%.2lf\n",x/24.0);
}
pf("\n");
}
return 0;
}

Traveler Nobita (zoj 3456 最小生成树)的更多相关文章

  1. ZOJ 3456 Traveler Nobita 最小生成树

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

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

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

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

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

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

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

  5. 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 ...

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

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

  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 2966 Build The Electric System 最小生成树

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

  9. ZOJ 1586 QS Network Kruskal求最小生成树

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

随机推荐

  1. 【Henu ACM Round#15 A】 A and B and Chess

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 统计大写和小写的个数. 比较答案.输出即可. [代码] #include <bits/stdc++.h> using n ...

  2. win7安装python开发环境,执行python

    在win7上安装python的开发环境是很easy的事情 Step1:下载python安装文件 url:https://www.python.org/download 去这里找到你想要下载的文件 St ...

  3. 从零使用qemu模拟器搭建arm执行环境

    为什么会有这篇文章 早在2011年的时候,跟当时同事一起讨论,做Linux系统开发正处于整个Linux开发中间层,没有上层的C/C++业务和数据库的开发经验.也没有底层的内核和驱动开发经验,究竟路该怎 ...

  4. 迷茫了好一阵决定做WEB前端

    前两个学期事实上总是每一个学期给自己做一个计划.可是计划都付诸流水,不是自己不坚持,仅仅由于目标太不明白,总是不见成效.前一段时间最终感觉计划还得做,可是不能超过一个月,要把计划做到仔细到每一周每一天 ...

  5. jquery20--animate() : 运动的方法

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. vim 实际行跟屏幕行移动命令

    我们使用vim的时候,经常会碰到那种情况,就是我们输入的内容过长,中间一直不换行.当我们一行的长度超出电脑屏幕的时候,我们会发现这时候文字自动换行了.不过,如果你使用行号看的话,其实这新的一行是没有行 ...

  7. html的学习思维导图

  8. android webview 报 [ERROR:in_process_view_renderer.cc(189)] Failed to request GL process. Deadlock likely: 0 问题

    工作中遇到 使用webview中加载含有audio标签的页面时提示[ERROR:in_process_view_renderer.cc(189)] Failed to request GL proce ...

  9. 运动识别之HOJ3D和HMM

    http://cvrc.ece.utexas.edu/Publications/Xia_HAU3D12.pdf   View Invariant Human Action Recognition Us ...

  10. django第三方库

    1. django_celery_beat 作用:网页端配置定时任务 注意:1,需要迁移表格 2.需要注册app python3 manage.py makemigrations python3 ma ...