All pastes #33178 Raw Edit

Untitled

public text v1 · immutable
#33178 ·published 2005-12-10 14:37 UTC
rendered paste body
import sys

class Graph:
    def __init__(self, f):
        self.reset()
        self.read(f)

    def reset(self):
        self.vertex = []
        self.edge = []

    def read(self, f):
        if not isinstance(f, file): f = file(f)
        
        nvertex, nedge = map(int, f.readline().split())
        for i in xrange(nvertex):
            vx, vy, vdeg = map(int, f.readline().split())
            self.vertex.append((vx, vy))
        for i in xrange(nedge):
            v1, v2 = map(int, f.readline().split())
            self.edge.append((v1, v2))

def load(n):
    return Graph('Graphs\\ch%04d.graph' % n)

def similarity(src, dest):
    dists = []
    for v in dest.vertex:
        idists = []
        for e in src.edge:
            start, end = src.vertex[e[0]], src.vertex[e[1]]
            if start == end: continue
            delta = (end[0] - start[0], end[1] - start[1])
            vv = (v[0] - start[0], v[1] - start[1])
            factor = float(vv[0] * delta[0] + vv[1] * delta[1]) / \
                    (delta[0] ** 2 + delta[1] ** 2)
            if factor < 0: factor = 0
            if factor > 1: factor = 1
            distance = ((vv[0] - factor * delta[0]) ** 2 + \
                        (vv[1] - factor * delta[1]) ** 2) ** 0.5
            idists.append(distance)
        dists.append(min(idists))
    return sum(dists) / len(dists)

g = []
for i in xrange(12):
    g.append(load(i+1))
for i in g:
    for j in g:
        print '%5.1f' % similarity(i, j),
    print