• 洛谷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分 差分约束
  • 相关阅读:
    工厂模式--工厂方法模式(Factory Method Pattern)
    工厂模式--简单工厂模式( Simple Factory Pattern )
    blog2.0--Springboot添加redis缓存(注解方式)
    blog2.0--JSR303参数校验+全局异常处理器
    高并发秒杀——SpringBoot集成redis
    SpringBoot报错HHH000206: hibernate.properties not found
    blog2.0--保存博客文章到本地磁盘
    Swagger注解 传参
    设计模式--单例模式
    跳表
  • 原文地址:https://www.cnblogs.com/thmyl/p/7804751.html
Copyright © 2020-2023  润新知