• 【BZOJ 4500 矩阵】


    Time Limit: 1 Sec  Memory Limit: 256 MB
    Submit: 390  Solved: 217
    [
    Submit][Status][Discuss]

    Description

    有一个n*m的矩阵,初始每个格子的权值都为0,可以对矩阵执行两种操作:

    1. 选择一行, 该行每个格子的权值加1或减1。

    2. 选择一列, 该列每个格子的权值加1或减1。

    现在有K个限制,每个限制为一个三元组(x,y,c),代表格子(x,y)权值等于c。问是否存在一个操作序列,使得操作完后的矩阵满足所有的限制。如果存在输出”Yes”,否则输出”No”。

    Input

    先输入一个T(T <= 5)代表输入有T组数据,每组数据格式为:

    第一行三个整数n, m, k (1 <= n, m,k <= 1000)。

    接下来k行,每行三个整数x, y, c。

    Output

    对于每组数据,输出Yes或者No。

    Sample Input

    2
    2 2 4
    1 1 0
    1 2 0
    2 1 2
    2 2 2
    2 2 4
    1 1 0
    1 2 0
    2 1 2
    2 2 1

    Sample Output

    Yes
    No

    HINT

    Source

    【题解】

        ①行列差分约束。

        ②每个行每个列看做一个点。

        ③建立超级源点保证图连通,进行一次SPFA即可解决。

    #include<queue>
    #include<stdio.h>
    #define inf 1000000007
    #define go(i,a,b) for(int i=a;i<=b;i++)
    #define fo(i,a,x) for(int i=a[x],v=e[i].v;i;i=e[i].next,v=e[i].v)
    const int N=2010;
    struct E{int v,next,w;}e[N<<2];
    int T,n,m,K,head[N],k,x,y,v,S,d[N],vis[N];bool inq[N],bad;
    void ADD(int u,int v,int w){e[k]=(E){v,head[u],w};head[u]=k++;}
    
    bool SPFA()
    {
    	std::queue<int>q;d[S]=0;
    	while(!q.empty())q.pop();q.push(S);int u;
    	while(!q.empty())
    	{
    		inq[u=q.front()]=0;q.pop();
    		fo(i,head,u)if(d[u]+e[i].w<d[v])
    		{
    			d[v]=d[u]+e[i].w;	
    			if((++vis[v])>(n+m))return 0;	
    			if(!inq[v])inq[v]=1,q.push(v);
    		}
    	}
    	return 1;
    }
    
    int main()
    {
    	scanf("%d",&T);
    	while(T--&&scanf("%d%d%d",&n,&m,&K))
    	{
    		go(i,0,n+m)d[i]=inf,head[i]=inq[i]=vis[i]=0;bad=0;k=1;
    		go(i,1,K)scanf("%d%d%d",&x,&y,&v),ADD(x,y+n,v),ADD(y+n,x,-v);
    		go(i,1,n+m)ADD(S,i,0);puts(SPFA()?"Yes":"No");
    	}
    	return 0;
    }//Paul_Guderian
    

    .

  • 相关阅读:
    CSS动画小结
    CSS效果常见问题
    CSS效果小结
    CSS(非布局样式)
    CSS(选择器)
    SkipList
    实现一个简易版RPC
    实现一个简易版的SpringMvc框架
    关于缓存击穿
    java多线程系列 目录
  • 原文地址:https://www.cnblogs.com/Damitu/p/7805476.html
Copyright © 2020-2023  润新知