CREATE TABLE #Grid(v1 SMALLINT NOT NULL CHECK (v1 > 0), v2 SMALLINT NOT NULL CHECK (v2 > 0), PRIMARY KEY (v1, v2), CHECK (v1 < v2));INSERT INTO #Grid (v1, v2)VALUES (1, 2), (1, 4), (2, 3), (2, 5), (2, 6); DECLARE @Covers TABLE (v SMALLINT -- Covering vertex ,vn VARCHAR(8000)) -- Covered verticesWHILE EXISTS ( SELECT v FROM #Grid CROSS APPLY (VALUES (v1),(v2)) a (v) EXCEPT SELECT Item FROM @Covers CROSS APPLY DelimitedSplit8K(vn, ','))BEGINWHILE EXISTS ( SELECT v FROM #Grid CROSS APPLY (VALUES (v1),(v2)) a (v) EXCEPT SELECT Item FROM @Covers CROSS APPLY DelimitedSplit8K(vn, ','))BEGIN ;WITH Counts AS ( SELECT v, n=COUNT(v) FROM ( SELECT v FROM #Grid CROSS APPLY (VALUES (v1),(v2)) a (v) WHERE v NOT IN ( SELECT Item FROM @Covers CROSS APPLY DelimitedSplit8K(vn, ','))) a GROUP BY v) INSERT INTO @Covers --OUTPUT INSERTED.* SELECT v, CAST(a.v AS VARCHAR(5)) + ( SELECT ',' + CASE WHEN v=v2 THEN CAST(v1 AS VARCHAR(5)) ELSE CAST(v2 AS VARCHAR(5)) END FROM #Grid b WHERE a.v = b.v1 OR a.v = b.v2 FOR XML PATH('')) FROM ( SELECT TOP 1 v FROM Counts ORDER BY n DESC, v) aENDENDSELECT * FROM @CoversDROP TABLE #Grid
USE tempdbGOIF OBJECT_ID('tempdb.dbo.Grid') IS NOT NULL DROP TABLE GridDECLARE @MinCover TABLE (Node INT)DECLARE @Node INTCREATE TABLE dbo.Grid( v1 INT ,v2 INT ,Processed BIT);INSERT INTO Grid (v1, v2, Processed)VALUES (1, 2, 0), (1, 4, 0), (2, 3, 0), (2, 5, 0), (2, 6, 0); WHILE EXISTS (SELECT * FROM Grid WHERE Processed = 0)BEGIN ;WITH NodeOcc AS ( SELECT Node = v1 FROM Grid UNION ALL SELECT v2 FROM Grid ) INSERT INTO @MinCover SELECT TOP 1 Node FROM NodeOcc WHERE Node NOT IN (SELECT Node FROM @MinCover) GROUP BY Node ORDER BY COUNT(*) DESC UPDATE G SET Processed = 1 FROM Grid G JOIN @MinCover NN ON G.v1 = NN.Node OR G.v2 = NN.NodeENDSELECT *FROM @MinCover