并查集

来源:互联网 发布:东方财富mac版 编辑:程序博客网 时间:2024/05/18 00:01

问题 C: 刘备闯三国之三顾茅庐(一)

时间限制: 1000 MS  内存限制: 128 MB
提交: 100  解决: 30
[提交][状态][讨论版]

题目描述


        刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县,西汉中山靖王刘胜的后代。刘备一生极具传奇色彩,早年颠沛流离、备尝艰辛最终却凭借自己的谋略终成一方霸主。那么在那个风云激荡的年代,刘备又是如何从一个卖草鞋的小人物一步一步成为蜀汉的开国皇帝呢?让我们一起拨开历史的迷雾,还原一个真实的刘备。

       公元207年冬至,当时驻军新野的刘备在徐庶的建议下,到南阳卧龙岗拜访诸葛亮。这是刘备第一次拜访诸葛亮的故事。三国演义记载的事,由于诸葛亮出游去了,导致刘备无功而返。然而据我考古发现,其实诸葛亮是抛出了如下的问题,想考察刘备本人的谋略、以确定其是否是自己要效忠的那个人:

        由于战事频发,朝廷派兵往n(2<=n<=10000)个城镇押运粮草,但是沟通不顺畅,导致有些城镇粮草多运了,而有些城镇则少运了。由于战争的影响,一些道路被毁坏,但城镇之间仍有m(0<=m<=50000)条尚未损毁的道路,诸葛亮想知道是否有可能使得利用现有的道路,重新在城镇间运载粮草,使得每个城镇需要的粮草不多也不少?

        刘备为人宽厚仁爱,但对此类问题也是束手无策,这时候就是是你表现的时候了。

输入

第一行包含两个整数n(2<=n<=10000) 和m(0<=m<=50000)。

以下n行,每一行包括一个整数,分别表示城镇0到城镇n-1多运的粮草,如果为负数,则表示少运了。保证输入中,这n个数和为0。

以下m行,每一行包含两个整数x,y(0<=x<y<=n-1),表示城镇x和城镇y存在一条道路。

输出

 如果存在一种运载方案,输出POSSIBLE,否则输出IMPOSSIBLE。

样例输入

5 3
100
-75
-25
-42
42
0 1
1 2
3 4

样例输出

POSSIBLE
#include#include#includeusing namespace std;const int maxz = 10001;int father[maxz];void makeset(int x){    father[x]=x;}int find(int x) {    if (x != father[x]) father[x] = find(father[x]);    return father[x];}int main(){   int n, m, x, y,c,b;   cin>>n>>m;   int a[n];   for(int i=0; i>a[i];   for(int i=0; i>x>>y;       c=find(x);b=find(y);       father[max(c,b)]=min(c,b);   }   for(int i=0; i

0 0