zoukankan      html  css  js  c++  java
  • Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

    Problem H. Hard Test
    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://codeforces.com/gym/100342/attachments

    Description

    Andrew is having a hard time preparing his 239-th contest for Petrozavodsk. This time the solution to the problem is based on Dijkstra algorithm and Andrew wants to prepare the hard test for the algorithm.
    The Dijkstra algorithm is used to find the shortest path from a source vertex to all other vertices in a graph. The algorithm acts as follows. Let G be a weight directed graph with vertex set V , edge set E and weight function w : E → R +. Let all vertices be reachable from vertex s. The algorithm uses a set
    of vertices U, first initialized as empty. Each vertex is labeled with either an integer number, or with +∞. Initially all vertices are labeled with +∞, and the vertex s is labeled with 0. Denote the label of vertex v as d[v].
    A step of the algorithm is the following: the vertex with the minimal label that doesn’t belong to U is selected. Let this vertex be u. The vertex u is added to the set U, and each edge uv ∈ E is relaxed. The relaxation replaces d[v] with min(d[v], d[u] + w(uv)). The algorithm is over when all vertices belong to U. If the label of the vertex v has changed, the relaxation is said to be active.
    Now Andrew would like to create a graph with n vertices and m edges, such that the Dijkstra algorithm makes as many active relaxations as possible. Help him to create such graph. To avoid nondeterminism, each time when selecting a vertex with minimal label among vertices that are not in U there must be exactly one vertex with the minimal label.

    Input

    The first line of the input file contains two integer numbers: n and m — the number of vertices and the number of edges in the graph Andrew would like to create (4 ≤ n ≤ 1000, n − 1 ≤ m ≤ n 2/5).

    Output

    Output m lines — the edges of the graph. Each line must contain three integer numbers: the beginning of the edge, the end of the edge and the weight of the edge. All weights must be non-negative and must not exceed 106 . All vertices must be reachable from vertex 1. If Dijkstra algorithm is run with s = 1 there must be maximal possible number of active relaxations among all graphs with n vertices and m edges. There must be no loops and no parallel edges.

    Sample Input

    4 3

    Sample Output

    1 2 0
    1 3 1
    1 4 2

    HINT

    题意

    让你出数据卡用堆优化的迪杰斯特拉算法,要求松弛操作最多

    题解

    最多的情况就是每条边都会使得边松弛一次,然后构造的话,先构造一条边长为0的链,然后再从后面不断插入就好了= =

    其实我感觉我说的不是很清楚,看代码吧……

    注意,得插入有向边

    代码:

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define test freopen("test.txt","r",stdin)
    #define maxn 2001
    #define mod 1000000007
    #define eps 1e-9
    const int inf=0x3f3f3f3f;
    const ll infll = 0x3f3f3f3f3f3f3f3fLL;
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    //**************************************************************************************
    
    struct node
    {
        int x,y,z;
    };
    vector<node> Q;
    
    int main()
    {
        freopen("test.in","r",stdin);
        freopen("test.out","w",stdout);
        int n=read(),m=read();
        for(int i=2;i<=n;i++)
        {
            Q.push_back((node){i-1,i,0});
            m--;
        }
        for(int i=n;i>=2;i--)
        {
            if(m==0)
                break;
            for(int j=i-2;j>=1;j--)
            {
    
                if(m==0)
                    break;
                Q.push_back((node){i,j,i-j});
                m--;
                if(m==0)
                    break;
            }
            if(m==0)
                break;
        }
        for(int i=0;i<Q.size();i++)
        {
            if(Q[i].x>Q[i].y)
                swap(Q[i].x,Q[i].y);
            printf("%d %d %d
    ",Q[i].x,Q[i].y,Q[i].z);
        }
        return 0;
    }
  • 相关阅读:
    小白初学iOS中OTA部署(适应iOS7.1)
    CocoaPods管理本地库简单步骤
    CocoaPods问题记录
    UIPanGestureRecognizer下方法
    2013年度总结(反思篇)
    iOS7中cell的分割线右移的解决方法
    接触CocoaPods遇到的问题
    iOS摄像头问题
    iPhone4激活出错,菜鸟试验!!!!!
    详解UIPickerView
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4708851.html
Copyright © 2011-2022 走看看