Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- MOD=10**9+7
- for case in xrange(int(raw_input())):
- M=int(raw_input())
- rea=[set([]) for _ in xrange(M)]
- arr=[None]*M
- for i in xrange(M):
- a,b=map(int,raw_input().split())
- rea[a-1].add(i)
- rea[b-1].add(i)
- arr[i]=[a-1,b-1]
- g=map(int,raw_input().split())
- rea0=set([])
- lev=[-1]*M
- lev[0]=0
- todo=set(rea[0])
- cyc=set([]) if 0 not in rea[0] else set([0])
- while todo:
- x=todo.pop()
- if x not in rea0:
- for y in rea[x]:
- if y not in rea0:
- rea0.add(y)
- todo.add(y)
- lev[y]=lev[x]+1
- else:
- cyc.add(y)
- alls=sum(g[i] for i in rea0)
- if alls==0:
- print "Case #"+str(case+1)+": "+str(g[0])
- else:
- for i in xrange(M):
- if i in rea0:
- a,b=arr[i]
- if a not in rea0:
- if b not in rea0:
- arr[i]=[]
- g[i]=0
- else:
- arr[i]=b
- elif b not in rea0:
- arr[i]=[a]
- isunb=False
- for x in cyc:
- act=x
- for i in xrange(lev[x]):
- if len(arr[act])>1:
- isunb=True
- break
- else:
- act=arr[act][0] # should always give one
- if isunb:
- print "Case #"+str(case+1)+": UNBOUNDED"
- else:
- levs={i: set([]) for i in xrange(M+1)}
- for i in xrange(M):
- if lev[i]!=-1:
- levs[lev[i]].add(i)
- for i in reversed(xrange(M)):
- for x in levs[i]:
- act=g[x]
- for a in arr[x]:
- g[a]=(g[a]+act)%MOD
- print "Case #"+str(case+1)+": "+str(g[0])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement