zoukankan      html  css  js  c++  java
  • AtCoder Beginner Contest 087 D

    Time limit : 2sec / Memory limit : 256MB

    Score : 400 points

    Problem Statement

    There are N people standing on the x-axis. Let the coordinate of Person i be xi. For every i, xi is an integer between 0 and 109 (inclusive). It is possible that more than one person is standing at the same coordinate.

    You will given M pieces of information regarding the positions of these people. The i-th piece of information has the form (Li,Ri,Di). This means that Person Ri is to the right of Person Li by Di units of distance, that is, xRixLi=Di holds.

    It turns out that some of these M pieces of information may be incorrect. Determine if there exists a set of values (x1,x2,…,xN) that is consistent with the given pieces of information.

    Constraints

    • 1≤N≤100 000
    • 0≤M≤200 000
    • 1≤Li,RiN (1≤iM)
    • 0≤Di≤10 000 (1≤iM)
    • LiRi (1≤iM)
    • If ij, then (Li,Ri)≠(Lj,Rj) and (Li,Ri)≠(Rj,Lj).
    • Di are integers.

    Input

    Input is given from Standard Input in the following format:

    N M
    L1 R1 D1
    L2 R2 D2
    :
    LM RM DM
    

    Output

    If there exists a set of values (x1,x2,…,xN) that is consistent with all given pieces of information, print Yes; if it does not exist, print No.


    Sample Input 1

    Copy
    3 3
    1 2 1
    2 3 1
    1 3 2
    

    Sample Output 1

    Copy
    Yes
    

    Some possible sets of values (x1,x2,x3) are (0,1,2) and (101,102,103).


    Sample Input 2

    Copy
    3 3
    1 2 1
    2 3 1
    1 3 5
    

    Sample Output 2

    Copy
    No
    

    If the first two pieces of information are correct, x3x1=2 holds, which is contradictory to the last piece of information.


    Sample Input 3

    Copy
    4 3
    2 1 1
    2 3 5
    3 4 2
    

    Sample Output 3

    Copy
    Yes
    

    Sample Input 4

    Copy
    10 3
    8 7 100
    7 9 100
    9 8 100
    

    Sample Output 4

    Copy
    No
    

    Sample Input 5

    Copy
    100 0
    

    Sample Output 5

    Copy
    Yes

    dfs,用邻接表标记每一个访问过的点,没访问的,更新dis(dis为当前子图中任意一点到其他点的距离),访问过看一下是否与dis匹配,不匹配就不满足。
    代码:

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <iomanip>
    using namespace std;
    struct info
    {
        int l,r,d;
    }s[400005];
    int n,m;
    int flag = 1;
    int dis[100005],visited[100005];
    int first[400005],nexti[400005];
    void dfs(int t)
    {
        if(!flag)return;
        int k = first[t];
        while(k != -1)
        {
            if(!flag)return;
            if(!visited[s[k].r])
            {
                dis[s[k].r] = dis[s[k].l] + s[k].d;
                visited[s[k].r] = 1;
                dfs(s[k].r);
            }
            else if(s[k].d != (dis[s[k].r] - dis[s[k].l]))
            {
                flag = 0;
                return;
            }
            k = nexti[k];
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        memset(first,-1,sizeof(first));
        for(int i = 0;i < m;i ++)
        {
            scanf("%d%d%d",&s[i].l,&s[i].r,&s[i].d);
            nexti[i] = first[s[i].l];
            first[s[i].l] = i;
            s[i + m].r = s[i].l;
            s[i + m].l = s[i].r;
            s[i + m].d = -s[i].d;
            nexti[i + m] = first[s[i + m].l];
            first[s[i + m].l] = i + m;
        }
        for(int i = 1;i <= n;i ++)
        {
            if(!visited[i])
            {
                visited[i] = 1;
                dfs(i);
            }
        }
        if(flag)printf("Yes");
        else printf("No");
    }
  • 相关阅读:
    java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法
    win7系统c盘瘦身,去虚拟内存方式
    跟据经纬度实现附近搜索Java实现
    Java 406
    window.showModalDialog 子窗口和父窗口不兼容最新的谷歌
    <html:text> Id属性
    Unity3D GUI学习之GUI窗口的使用
    Unity3D GUI学习之GUILayout控件及使用
    Unity3D GUI之自定义风格组件
    Unity3D GUI学习
  • 原文地址:https://www.cnblogs.com/8023spz/p/8409331.html
Copyright © 2011-2022 走看看