zoukankan      html  css  js  c++  java
  • 洛谷P2294 [HNOI2005]狡猾的商人

    P2294 [HNOI2005]狡猾的商人

    题目描述

    输入输出格式

    输入格式:

    从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要你判断。每组数据的第一行为两个正整数n和m,其中n < 100,m < 1000,分别表示对应的账本记录了多少个月的收入情况以及偷看了多少次账本。接下来的m行表示刁姹偷看m次账本后记住的m条信息,每条信息占一行,有三个整数s,t和v,表示从第s个月到第t个月(包含第t个月)的总收入为v,这里假设s总是小于等于t。

    输出格式:

    输出文件output.txt中包含w行,每行是true或false,其中第i行为true当且仅当第i组数据,即第i个账本不是假的;第i行为false当且仅当第i组数据,即第i个账本是假的。

    输入输出样例

    输入样例#1: 复制
    2
    3 3
    1 2 10
    1 3 -5
    3 3 -15
    5 3
    1 5 100
    3 5 50
    1 2 51
    
    输出样例#1: 复制
    true
    false
    /*
        带权并查集:f[i]表示从i所在直线的起点到i的总价值是多少 
    */
    #include<iostream>
    #include<cstdio>
    #define maxn 1001
    using namespace std;
    int fa[maxn],f[maxn],n,m;
    int find(int x){
        if(x==fa[x])return x;
        int k=fa[x],kk=find(fa[x]);
        f[x]+=f[k];fa[x]=kk;
        return kk;
    }
    int main(){
        int T;scanf("%d",&T);
        while(T--){
            scanf("%d%d",&n,&m);
            for(int i=0;i<=n;i++)fa[i]=i,f[i]=0;
            bool flag=0;int x,y,z;
            for(int i=1;i<=m;i++){
                scanf("%d%d%d",&x,&y,&z);
                x--;
                int f1=find(x),f2=find(y);
                if(f1!=f2){
                    fa[f2]=f1;f[f2]=f[x]+z-f[y];
                }
                else if(f[x]+z!=f[y]){
                    puts("false");flag=1;
                    break;
                }
            }
            if(flag==0)puts("true");
        }
    }
    100分 带权并查集
    #include<iostream>
    #include<cstdio>
    #include<stack>
    #include<queue>
    #include<cstring>
    #define maxn 1001
    using namespace std;
    int n,m,T,head[maxn],num,dis[maxn],t[maxn];
    bool vis[maxn];
    struct node{
        int to,pre,v;
    }e[maxn*2];
    void Insert(int from,int to,int v){
        e[++num].to=to;
        e[num].pre=head[from];
        e[num].v=v;
        head[from]=num;
    }
    bool spfa(int s){
        queue<int>q;
        memset(vis,0,sizeof(vis));
        memset(dis,0x3f,sizeof(dis));
        q.push(s);vis[s]=1;dis[s]=0;t[s]++;
        while(!q.empty()){
            int now=q.front();q.pop();vis[now]=0;
            for(int i=head[now];i;i=e[i].pre){
                int to=e[i].to;
                if(dis[to]>dis[now]+e[i].v){
                    dis[to]=dis[now]+e[i].v;
                    if(!vis[to]){
                        q.push(to);vis[to]=1;
                        t[to]++;
                        if(t[to]>n)return 1;
                    }
                }
            }
        }
        return 0;
    }
    int main(){
        scanf("%d",&T);
        while(T--){
            bool flag=0;
            scanf("%d%d",&n,&m);
            memset(head,0,sizeof(head));
            memset(e,0,sizeof(e));
            memset(t,0,sizeof(t));
            num=0;
            int x,y,z;
            for(int i=1;i<=m;i++){
                scanf("%d%d%d",&x,&y,&z);
                Insert(x-1,y,-z);Insert(y,x-1,z);
            }
            for(int i=1;i<=n;i++){
                if(!t[i]){
                    if(spfa(i)){
                        puts("false");flag=1;
                        break;
                    }
                }
            }
            if(flag==0)puts("true");
        }
    }
    100分 差分约束
  • 相关阅读:
    java并发容器
    五种单例模式的写法
    Java中Volatile关键字
    Future模式实例
    mysql笔记
    亚马逊EC2服务器登录方法
    RSA加密方法java工具类
    Base64Util工具类
    maven命令创建项目
    关于spring事务注解
  • 原文地址:https://www.cnblogs.com/thmyl/p/7804751.html
Copyright © 2011-2022 走看看