그래프 간접


16

소개

이 과제에서는 자체 루프가있는 유 방향 그래프가 제공되며, 자체 루프없이 무 방향 그래프로 변환해야합니다.

입력

입력 값은 {0, 1, ..., n-1}일부 자연수에 대해 정점이 설정된 n ≥ 0(또는 {1, 2, ..., n}1 기반 색인을 사용하는 경우) 유 방향 그래프입니다 . 그래프는 길이 n목록 으로 제공되며, L여기서 L[i]vertex의 이웃에 대한 목록입니다 i. 예를 들어, 목록 [[0,1],[0],[1,0,3],[]]은 그래프를 나타냅니다

.-.
| v
'-0<--2-->3
  ^   |
  |   |
  v   |
  1<--'

이웃 목록은 반드시 주문할 필요는 없지만 중복되지는 않습니다.

산출

출력은 다음과 같이 입력과 동일한 형식의 다른 그래프입니다.

  1. 모든 자체 루프를 삭제하십시오.
  2. 나머지 가장자리마다 u -> v반전 가장자리가 v -> u없으면 추가합니다 .

입력과 마찬가지로 출력 그래프의 인접 목록은 순서가 맞지 않지만 중복을 포함 할 수는 없습니다. 위 그래프의 경우 올바른 출력은 [[1,2],[0,2],[0,1,3],[2]]이며 이는 그래프를 나타냅니다.

0<->2<->3
^   ^
|   |
v   |
1<--'

규칙

그래프에서 0 기반 또는 1 기반 색인을 사용할 수 있습니다. 기능과 전체 프로그램이 모두 허용됩니다. 가장 낮은 바이트 수가 이기고 표준 허점이 허용되지 않습니다.

테스트 사례

이 테스트 사례는 0 기반 인덱싱을 사용합니다. 1부터 시작하는 경우 각 숫자를 증가시킵니다. 이러한 인접 목록은 오름차순으로 정렬되지만 필수는 아닙니다.

[] -> []
[[0]] -> [[]]
[[],[0,1]] -> [[1],[0]]
[[0,1],[]] -> [[1],[0]]
[[0,1],[0],[1,0,3],[]] -> [[1,2],[0,2],[0,1,3],[2]]
[[3],[],[5],[3],[1,3],[4]] -> [[3],[4],[5],[0,4],[1,3,5],[2,4]]
[[0,1],[6],[],[3],[3],[1],[4,2]] -> [[1],[0,5,6],[6],[4],[3,6],[1],[1,2,4]]
[[6],[0,5,1],[5,4],[3,5],[4],[5,6],[0,3]] -> [[1,6],[0,5],[4,5],[5,6],[2],[1,2,3,6],[0,3,5]]
[[1,0],[5,1],[5],[1],[5,7],[7,1],[],[1]] -> [[1],[0,3,5,7],[5],[1],[5,7],[1,2,4,7],[],[1,4,5]]
[[2,8,0,9],[5,2,3,4],[0,2],[3,7,4],[8,1,2],[5,1,9,2],[6,9],[6,5,2,9,0],[9,1,2,0],[3,9]] -> [[2,7,8,9],[2,3,4,5,8],[0,1,4,5,7,8],[1,4,7,9],[1,2,3,8],[1,2,7,9],[7,9],[0,2,3,5,6,9],[0,1,2,4,9],[0,3,5,6,7,8]]

답변:


5

Pyth, 17 16 바이트

.e-.|f}k@QTUQbkQ

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명

                   implicit: Q = input
.e             Q   enumerated mapping of Q (k index, b out-neighbors):
     f     UQ         filter [0, 1, ..., len(Q)-1] for elements T, which satisfy:
      }k@QT              k in Q[T]
                      # this are the in-neighbors
   .|        b        setwise union with b 
  -           k       remove k

그런데, .e단지에서 전환 된 k,Yk,b따라서이 사용 실행,.e-.|f}k@QTUQbkQ
isaacg

@isaacg 온라인 컴파일러가 업데이트되면 그렇게 할 것입니다.
Jakube

업데이트되었습니다.
isaacg 2016 년

5

CJam, 43 40 35 34 33 바이트

Sp3000에서 2 바이트를 절약했습니다.

이것은 정말 우아한 솔루션으로 시작한 후 간과했던 일부 구멍을 뚫어 내려면서 점점 끔찍했습니다. 원래 아이디어가 여전히 구할 수 있는지 확실하지 않지만 최선을 다할 것입니다 ...

q~_,,\ff{&W+0=)}_z..-{_,{;(},+}%`

여기에서 테스트하십시오. 또는 전체 테스트 장치를 실행하십시오 .

환자가 죽었다고 확신하면 설명을 추가하겠습니다.


3

파이썬 2, 107 바이트

이 골프를 더 할 수 있는지 여전히 알아 내려고 노력하고 있지만 지금은 이것이 최선의 방법입니다.

def u(g):e=enumerate;o=[set(_)-{i}for i,_ in e(g)];[o[j].add(i)for i,_ in e(o)for j in _];print map(list,o)

중복을 방지하기 위해 세트를 사용합니다. 또한, 달리 list.remove(i), {S}-{i}경우 오류가 발생하지 않습니다 i에 있지 않습니다 S.


3

루비, 78 바이트

마지막으로 루비의 집합 연산자 ( [1,2]&[2]==[2][3,4,5]-[4]==[3,5])를 사용합니다.

->k{n=k.size;n.times{|i|n.times{|j|(k[j]&[i])[0]&&k[i]=(k[i]<<j).uniq-[i]}};k}

통과하는 모든 테스트 사례를 포함하여 ideone


2

CJam, 26 바이트

l~_,,:T.-_T\ff&Tf.e&.|:e_p

그리 짧지 않습니다 ...

설명

l~                           e# Read the input.
  _,,:T                      e# Get the graph size and store in T.
       .-                    e# Remove self-loops from the original input.
         _T\ff&              e# Check if each vertex is in each list, and
                             e# return truthy if yes, or empty list if no.
               Tf.e&         e# Convert truthy to vertex numbers.
                    .|       e# Merge with the original graph.
                      :e_    e# Remove empty lists.
                         p   e# Format and print.

1

자바 스크립트 (ES6), 96 (110)

인접 목록에서 인접 세트를 작성하면 중복을 피할 수 있습니다. 마지막으로 세트에서 시작하여 목록을 다시 작성합니다.

//Golfed 
U=l=>
  l.map((m,n)=>m.map(a=>a-n?s[n][a]=s[a][n]=1:0),s=l.map(m=>[]))
  &&s.map(a=>[~~k for(k in a)])

// Ungolfed

undirect=(adList)=>(
  adSets=adList.map(_ => []),
  adList.forEach((curAdList,curNode)=>{
    curAdList.forEach(adNode=>{
      if (adNode!=curNode) {
        adSets[curNode][adNode]=1,
        adSets[adNode][curNode]=1
      }
    })  
  }),
  adSets.map(adSet=>[~~k for(k in adSet)])
)

// Test
out=s=>OUT.innerHTML+=s+'\n'

test=[
 [ [], [] ]
,[ [[0]], [[]] ]
,[ [[],[0,1]] , [[1],[0]] ]
,[ [[0,1],[]] , [[1],[0]] ]

,[ [[0,1],[0],[1,0,3],[]] , [[1,2],[0,2],[0,1,3],[2]] ]
,[ [[3],[],[5],[3],[1,3],[4]] , [[3],[4],[5],[0,4],[1,3,5],[2,4]] ]
,[ [[0,1],[6],[],[3],[3],[1],[4,2]] , [[1],[0,5,6],[6],[4],[3,6],[1],[1,2,4]] ] 
,[ 
   [[6],[0,5,1],[5,4],[3,5],[4],[5,6],[0,3]] ,
   [[1,6],[0,5],[4,5],[5,6],[2],[1,2,3,6],[0,3,5]]  
 ]
,[
  [[1,0],[5,1],[5],[1],[5,7],[7,1],[],[1]] , 
  [[1],[0,3,5,7],[5],[1],[5,7],[1,2,4,7],[],[1,4,5]]
 ]

,[
  [[2,8,0,9],[5,2,3,4],[0,2],[3,7,4],[8,1,2],[5,1,9,2],[6,9],[6,5,2,9,0],[9,1,2,0],[3,9]] ,
  [[2,7,8,9],[2,3,4,5,8],[0,1,4,5,7,8],[1,4,7,9],[1,2,3,8],[1,2,7,9],[7,9],[0,2,3,5,6,9],  [0,1,2,4,9],[0,3,5,6,7,8]]
 ]
] 

show=l=>'['+l.map(a=>'['+a+']').join(',')+']'

test.forEach(t => (
  r = U(t[0]),
  ck = show(r) == show(t[1]),           
  out('Test ' + (ck ? 'OK: ':'FAIL: ') + show(t[0])+' -> ' + 
      '\nResult: ' + show(r) + 
      '\nCheck : ' + show(t[1]) + '\n\n')
) )
<pre id=OUT></pre>


0

자바, 150

a->{int i=0,j,k=a.size();for(;i<k;a.get(i).remove((Object)i++))for(j=k;j-->0;)if(a.get(j).contains(i)&!a.get(i).contains(j))a.get(i).add(j);return a;}

확장 가능하고 실행 가능한 코드 :

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function
public class C {
    static Function<List<List<Integer>>, List<List<Integer>>> f = a -> {
        int i = 0, j, k = a.size();
        for (; i < k; a.get(i).remove((Object) i++)) {
            for (j = k; j-- > 0;) {
                if (a.get(j).contains(i) & !a.get(i).contains(j)) {
                    a.get(i).add(j);
                }
            }
        }
        return a;
    };
    public static void main(String[] args) {
        System.out.println(f.apply(new ArrayList(Arrays.asList(
                new ArrayList(Arrays.asList(0, 1)),
                new ArrayList(Arrays.asList(1)),
                new ArrayList(Arrays.asList(1, 0, 3)),
                new ArrayList(Arrays.asList()))
        )));
    }
}

0

그루비-87

u={g->g.eachWithIndex{n,i->g[i]=n-i;g[i].each{g[it]<<i}};g.each{it=it.sort().unique()}}

테스트를 실행하기위한 전체 스크립트 :

u={g->g.eachWithIndex{n,i->g[i]=n-i;g[i].each{g[it]<<i}};g.each{it=it.sort().unique()}}
assert u([]) == []
assert u([[0]]) == [[]]
assert u([[],[0,1]]) == [[1],[0]]
assert u([[0,1],[]]) == [[1],[0]]
assert u([[0,1],[0],[1,0,3],[]]) == [[1,2],[0,2],[0,1,3],[2]]
assert u([[3],[],[5],[3],[1,3],[4]]) == [[3],[4],[5],[0,4],[1,3,5],[2,4]]
assert u([[0,1],[6],[],[3],[3],[1],[4,2]]) == [[1],[0,5,6],[6],[4],[3,6],[1],[1,2,4]]
assert u([[6],[0,5,1],[5,4],[3,5],[4],[5,6],[0,3]]) == [[1,6],[0,5],[4,5],[5,6],[2],[1,2,3,6],[0,3,5]]
assert u([[1,0],[5,1],[5],[1],[5,7],[7,1],[],[1]]) == [[1],[0,3,5,7],[5],[1],[5,7],[1,2,4,7],[],[1,4,5]]
assert u([[2,8,0,9],[5,2,3,4],[0,2],[3,7,4],[8,1,2],[5,1,9,2],[6,9],[6,5,2,9,0],[9,1,2,0],[3,9]]) == [[2,7,8,9],[2,3,4,5,8],[0,1,4,5,7,8],[1,4,7,9],[1,2,3,8],[1,2,7,9],[7,9],[0,2,3,5,6,9],[0,1,2,4,9],[0,3,5,6,7,8]]

0

매스 매 티카, 84 66 64 바이트

1 기반 색인 사용.

MapIndexed[Union[#,First/@l~Position~Tr@#2]~Complement~#2&,l=#]&

0

파이썬 3, 127 바이트

l=list;g=l(map(set,eval(input())))
for i in range(len(g)):
    for j in g[i]:g[j]=g[j]^g[j]&{j}|{i}
print(l(map(l,g)))

온라인으로 시도

최선의 시도가 아닙니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.