2020-09-24 12:49:49 +02:00
|
|
|
import numpy as np
|
|
|
|
import networkx as nx
|
|
|
|
import argparse
|
2020-09-24 15:43:13 +02:00
|
|
|
import time
|
2020-09-24 12:49:49 +02:00
|
|
|
|
2020-09-24 13:01:30 +02:00
|
|
|
parser = argparse.ArgumentParser(description='')
|
2020-09-24 12:49:49 +02:00
|
|
|
parser.add_argument('-g', '--graph', dest='graph', action='store', default=None)
|
2020-09-24 13:01:30 +02:00
|
|
|
args = parser.parse_args()
|
2020-09-24 12:49:49 +02:00
|
|
|
|
|
|
|
if not args.graph:
|
2020-09-24 13:01:30 +02:00
|
|
|
print("need a graph as input")
|
2020-09-24 12:49:49 +02:00
|
|
|
exit()
|
|
|
|
|
2020-09-24 13:01:30 +02:00
|
|
|
|
2020-09-24 12:49:49 +02:00
|
|
|
def read_graph(graph_file):
|
|
|
|
with open(graph_file) as f:
|
2020-09-24 15:43:13 +02:00
|
|
|
n = int(f.readline()) # pontok száma
|
|
|
|
m = int(f.readline()) # élek száma
|
|
|
|
A = [[0] * n for _ in range(n)] # táblázat, ahol az élek helyén 1 van, ammeg 0
|
2020-09-24 12:49:49 +02:00
|
|
|
for _ in range(m):
|
2020-09-24 13:01:30 +02:00
|
|
|
[u, v] = map(int, f.readline().split())
|
|
|
|
A[u][v] = 1
|
|
|
|
A[v][u] = 1
|
|
|
|
G = nx.Graph(np.array(A))
|
2020-09-24 12:49:49 +02:00
|
|
|
return G
|
|
|
|
|
2020-09-24 13:01:30 +02:00
|
|
|
|
2020-09-24 15:43:13 +02:00
|
|
|
input_graph = read_graph(args.graph)
|
|
|
|
|
|
|
|
|
2020-09-24 12:49:49 +02:00
|
|
|
def max_comp_size(G):
|
|
|
|
return max([len(c) for c in nx.connected_components(G)])
|
|
|
|
|
2020-09-24 13:01:30 +02:00
|
|
|
|
2020-09-24 15:43:13 +02:00
|
|
|
def run_random_once() -> list:
|
|
|
|
del_list = []
|
|
|
|
G = input_graph.copy()
|
|
|
|
target = len(G.nodes) / 2
|
|
|
|
while max_comp_size(G) > target:
|
|
|
|
u = np.random.choice(G.nodes)
|
|
|
|
if u not in del_list:
|
|
|
|
del_list.append(u)
|
|
|
|
G.remove_node(u)
|
|
|
|
|
|
|
|
return del_list
|
|
|
|
|
|
|
|
|
|
|
|
def remove_highest_kebab() -> list:
|
|
|
|
del_list = []
|
|
|
|
G = input_graph.copy()
|
|
|
|
target = len(G.nodes) / 2
|
|
|
|
|
|
|
|
while max_comp_size(G) > target:
|
|
|
|
highest_node = None
|
|
|
|
highest_node_deg = 0
|
|
|
|
for node in G.nodes:
|
|
|
|
if G.degree[node] > highest_node_deg:
|
|
|
|
highest_node = node
|
|
|
|
highest_node_deg = G.degree[node]
|
|
|
|
|
|
|
|
del_list.append(highest_node)
|
|
|
|
G.remove_node(highest_node)
|
|
|
|
|
|
|
|
return del_list
|
2020-09-24 12:49:49 +02:00
|
|
|
|
|
|
|
|
2020-09-24 15:43:13 +02:00
|
|
|
print(len(remove_highest_kebab()))
|
2020-09-24 12:49:49 +02:00
|
|
|
|
2020-09-24 15:43:13 +02:00
|
|
|
# target_runtime = 600
|
|
|
|
# start_time = time.time()
|
|
|
|
# results = []
|
|
|
|
# while (time.time() - start_time) < target_runtime:
|
|
|
|
# for _ in range(50):
|
|
|
|
# results.append(run_random_once())
|
|
|
|
#
|
|
|
|
# print("Total runs: ", len(results))
|
|
|
|
# print("Min: ", min(results))
|
|
|
|
# print("Max: ", max(results))
|
|
|
|
# print("Runtime: ", time.time() - start_time)
|