【分析】:本题可以用并查集实现。
每输入一组数据,将其处理:若两者父亲不相同(不在同一组),合并,并将盈利储存(代码中的value数组,表示第x个月前的盈利);
否则进行判断(用第y月的盈利-第x月盈利,看是否等于v),不符合可以直接退出,输出false。
但需注意几处:
①:写在get里的
int get(int x) { if(fa[x]==x) return x; tmp=get(fa[x]); value[x]+=value[fa[x]]; fa[x]=tmp; return fa[x]; }
不可省略为
int get(int x) { if(fa[x]==x) return x; value[x]+=value[fa[x]]; fa[x]=get(fa[x]); return fa[x]; }
因为在get(fa[x])时可能将一些参数调整,此处坑了我好久(见笑......)
②:为防止出现x,y相同的数据出现(如样例1),需将x减1再进行操作,尽管数值改变但相对位置不会变
【代码】:
#include<stdio.h> #include<string.h> #include<string.h> #include<iostream> #include<algorithm> #include<bitset> #include<vector> #include<queue> #include<stack> using namespace std; #define MAX 101 int CASE; int N,M,tmp=0; int fa[MAX],value[MAX]; bool is=true; int get(int x) { if(fa[x]==x) return x; tmp=get(fa[x]); value[x]+=value[fa[x]]; fa[x]=tmp; return fa[x]; } void pre() { memset(value,0,sizeof(value)); for(int i=0;i<=N;i++) fa[i]=i; } void work(int x,int y,int v) { int fx=get(x),fy=get(y); if(fx!=fy) { fa[fx]=fy; value[fx]=value[y]-value[x]-v; } else if(value[y]-value[x]!=v) is=false; } int main() { //freopen("shop.in","r",stdin); //freopen("shop.out","w",stdout); scanf("%d",&CASE); for(int i=1;i<=CASE;i++) { is=true; scanf("%d%d",&N,&M); pre(); for(int j=1;j<=M;j++) { int A,B,C; scanf("%d%d%d",&A,&B,&C); work(A-1,B,C); } if(!is) printf("false\n"); else printf("true\n"); } return 0; }
转载注明出处:http://blog.csdn.net/u011400953