Traveler Nobita (zoj 3456 最小生成树)

原创 2015年07月08日 11:01:20

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;
}



zoj 2103 Marco Popo the Traveler

 第二次做这种题了。 先判连通,然后判欧拉,再找出来符合题意的最短交换次数。。。 WA了数次,WA得我都快没信心了。不过还是找出来好多BUGs,改了之后,顺利AC。。。 先判断连通,用并查集,不连通的...

POJ 1861||ZOJ1542 kruskal求最小生成树(POJ秒杀啊)

题意:用所给的网线链接所有的路流器,使得最长的单根网线的长度在所有方案中是最小的。 分析:本质还是求最小生成树。为了输出单根网线的长度在所有方案中是最小的以及输入p对顶点,需要在选择的时候记录下已选...

zoj2048_Highways(最小生成树)

#include #include #include #include #include #include #include #include using namespace std;struct e...

ZOJ 1203 Swordfish(最小生成树 kruskal)

题意  给你n个点的坐标  每个点都可与其它n-1个点相连  求这n个点的最小生成树的权重 裸的最小生成树  直接kruskal咯 #include #include #include #includ...
  • acvay
  • acvay
  • 2014年10月22日 09:39
  • 910

POJ1789&ZOJ2158--Truck History【最小生成树变形】

链接:http://poj.org/problem?id=1789 题意:卡车公司有悠久的历史,它的每一种卡车都有一个唯一的字符串来表示,长度为7,它的所有卡车(除了第一辆)都是由以前的卡车派生出来...
  • zzzz40
  • zzzz40
  • 2014年08月04日 20:10
  • 631

ZOJ 1586 QS Network(最小生成树)

Sunny Cup 2003 - Preliminary RoundApril 20th, 12:00 - 17:00Problem E: QS NetworkIn the planet w-503 ...

ZOJ2326Tangled in Cables(最小生成树)

Tangled in Cables Time Limit: 2 Seconds      Memory Limit: 65536 KB You are the owner of SmallCabl...
  • z8110
  • z8110
  • 2015年08月12日 21:02
  • 471

zoj 3204 Connect them//最小生成树

kru算法。 #include #include #include #include using namespace std; int n,g[111][111]; class node { p...

ZOJ - 1586 QS Network (最小生成树 Kruskal)

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=586 题意

zoj 1542 Network(最小生成树))

Network Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Andrew is working as...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Traveler Nobita (zoj 3456 最小生成树)
举报原因:
原因补充:

(最多只允许输入30个字)