riibka před 7 měsíci
revize
160dbdccc3

+ 398 - 0
.gitignore

@@ -0,0 +1,398 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.tlog
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio 6 auto-generated project file (contains which files were open etc.)
+*.vbp
+
+# Visual Studio 6 workspace and project file (working project files containing files to include in project)
+*.dsw
+*.dsp
+
+# Visual Studio 6 technical files
+*.ncb
+*.aps
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# Visual Studio History (VSHistory) files
+.vshistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
+
+# VS Code files for those working on multiple tools
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+*.code-workspace
+
+# Local History for Visual Studio Code
+.history/
+
+# Windows Installer files from build outputs
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# JetBrains Rider
+*.sln.iml

+ 25 - 0
TravMerchant.sln

@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.9.34723.18
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TravMerchant", "TravMerchant\TravMerchant.csproj", "{A00EF343-7888-4363-B713-7AF9C9B2211E}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{A00EF343-7888-4363-B713-7AF9C9B2211E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A00EF343-7888-4363-B713-7AF9C9B2211E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A00EF343-7888-4363-B713-7AF9C9B2211E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A00EF343-7888-4363-B713-7AF9C9B2211E}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {5AD073E4-EAAC-4D3D-A190-3CB3FEA002C7}
+	EndGlobalSection
+EndGlobal

+ 6 - 0
TravMerchant/App.config

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
+    </startup>
+</configuration>

+ 43 - 0
TravMerchant/Program.cs

@@ -0,0 +1,43 @@
+using System;
+using System.CodeDom;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using System.Windows.Markup;
+
+namespace TravMerchant
+{
+    internal class Program
+    {
+        static void Main()
+        {
+            var table = new int?[,] {
+                { null, 20, 18, 12, 8 },
+                { 5, null, 14, 7, 11 },
+                { 12, 18, null, 6, 11 },
+                { 11, 17, 11, null, 12 },
+                { 5, 5, 5, 5, null },
+            };
+
+            var matrix = new ReducableMatrix(table);
+
+            SolutionNode node = new SolutionNode(matrix);
+
+            var pathPoints = node.Solve();
+            int[] path = new int[pathPoints.Count];
+            path[0] = 0;
+            for (int i = 1; i < path.Length; i++)
+            {
+                path[i] = pathPoints.Find(point => point.Item1 == path[i - 1]).Item2;
+            }
+
+            for (int i = 0; i < path.Length; i++)
+            {
+                Console.Write($"{(char)('A' + path[i])} -> ");
+            }
+
+            Console.WriteLine('A');
+
+            Console.ReadKey();
+        }
+    }
+}

+ 36 - 0
TravMerchant/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Общие сведения об этой сборке предоставляются следующим набором
+// набора атрибутов. Измените значения этих атрибутов для изменения сведений,
+// связанные с этой сборкой.
+[assembly: AssemblyTitle("TravMerchant")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("TravMerchant")]
+[assembly: AssemblyCopyright("Copyright ©  2024")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
+// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
+// из модели COM задайте для атрибута ComVisible этого типа значение true.
+[assembly: ComVisible(false)]
+
+// Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM
+[assembly: Guid("a00ef343-7888-4363-b713-7af9c9b2211e")]
+
+// Сведения о версии сборки состоят из указанных ниже четырех значений:
+//
+//      Основной номер версии
+//      Дополнительный номер версии
+//      Номер сборки
+//      Номер редакции
+//
+// Можно задать все значения или принять номера сборки и редакции по умолчанию 
+// используя "*", как показано ниже:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 217 - 0
TravMerchant/ReducableMatrix.cs

@@ -0,0 +1,217 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace TravMerchant
+{
+    public class ReducableMatrix
+    {
+        private int?[,] matrix;
+
+        private SortedSet<int> rowReduces = new SortedSet<int>();
+        private SortedSet<int> columnReduces = new SortedSet<int>();
+
+        private List<(int, int)> path = new List<(int, int)>();
+
+        public ReducableMatrix(int?[,] matrix)
+        {
+            //Конструктор, клонирующий матрицу, для того, чтобы не затрагивать исходную по ходу программы
+            this.matrix = (int?[,])matrix.Clone();
+        }
+
+        // Клонирующий конструктор
+        public ReducableMatrix(ReducableMatrix matrix)
+        {
+            this.matrix = (int?[,])matrix.matrix.Clone();
+            foreach (int reduce in matrix.rowReduces)
+                rowReduces.Add(reduce);
+            foreach (int reduce in matrix.columnReduces)
+                columnReduces.Add(reduce);
+            path.AddRange(matrix.path);
+        }
+
+        private ReducableMatrix(ReducableMatrix matrix, int row, int column) : this(matrix)
+        {
+            this.matrix[column, row] = null;
+            rowReduces.Add(row);
+            columnReduces.Add(column);
+            path.Add((row, column));
+        }
+
+        //Доступ по локал координатам 
+        public int? this[int i, int j]
+        {
+            get
+            {
+                var coords = Unreduce(i, j);
+                return matrix[coords.Item1, coords.Item2];
+            }
+            set
+            {
+                var coords = Unreduce(i, j);
+                matrix[coords.Item1, coords.Item2] = value;
+            }
+        }
+
+        public int GetLength(int dimension) => matrix.GetLength(dimension) - rowReduces.Count;
+
+        //возврат копии матрицы без строки и ряда
+        public ReducableMatrix Reduce(int row, int column)
+        {
+            var p = Unreduce(row, column);
+            return new ReducableMatrix(this, p.Item1, p.Item2);
+        }
+
+        //перевод локал в глобал
+        private (int, int) Unreduce(int row, int column)
+        {
+            foreach (var reduce in rowReduces)
+            {
+                if (row >= reduce)
+                    row++;
+            }
+            foreach (var reduce in columnReduces)
+            {
+                if (column >= reduce)
+                    column++;
+            }
+            return (row, column);
+        }
+
+        public int[] RowMinimums()
+        {
+            int[] minimums = new int[GetLength(0)];
+            for (int i = 0; i < GetLength(0); i++)
+            {
+                minimums[i] = int.MaxValue;
+                for (int j = 0; j < GetLength(1); j++)
+                {
+                    if (this[i, j] == null)
+                        continue;
+                    if (minimums[i] > this[i, j])
+                        minimums[i] = (int)this[i, j];
+                }
+            }
+            return minimums;
+        }
+        
+        public int[] ColMinimums()
+        {
+            int[] minimums = new int[GetLength(1)];
+            for (int j = 0; j < GetLength(1); j++)
+            {
+                minimums[j] = int.MaxValue;
+                for (int i = 0; i < GetLength(0); i++)
+                {
+                    if (this[i, j] == null)
+                        continue;
+                    if (minimums[j] > this[i, j])
+                        minimums[j] = (int)this[i, j];
+                }
+            }
+            return minimums;
+        }
+        //Посчитать нижнюю границу + редукция строк и столбцов. 
+        public int? CalculateLowerBound(int? lastSum)
+        {
+            int[] rowMinimums = RowMinimums();
+            for (int i = 0; i < GetLength(0); i++)
+            {
+                for (int j = 0; j < GetLength(1); j++)
+                {
+                    if (this[i, j] != null)
+                        this[i, j] -= rowMinimums[i];
+                }
+            }
+
+            int[] colMinimums = ColMinimums();
+            for (int i = 0; i < GetLength(0); i++)
+            {
+                for (int j = 0; j < GetLength(1); j++)
+                {
+                    if (this[i, j] != null)
+                        this[i, j] -= colMinimums[j];
+                }
+            }
+
+            return rowMinimums.Sum() + colMinimums.Sum() + lastSum;
+        }
+
+        public int?[,] CalculateWeights()
+        {
+            int?[,] weights = new int?[GetLength(0), GetLength(1)];
+            for (int i = 0; i < GetLength(0); i++)
+            {
+                for (int j = 0; j < GetLength(1); j++)
+                {
+                    if (this[i, j] == 0)
+                    {
+                        int? min = null;
+                        for (int k = 0; k < GetLength(0); k++)
+                        {
+                            if (this[i, j] == null || j == k)
+                                continue;
+                            if (min == null || this[i, k] < min)
+                                min = this[i, k];
+                        }
+                        weights[i, j] = min;
+                        min = null;
+                        for (int k = 0; k < GetLength(1); k++)
+                        {
+                            if (this[i, j] == null || i == k)
+                                continue;
+                            if (min == null || this[k, j] < min)
+                                min = this[k, j];
+                        }
+                        weights[i, j] += min;
+                    }
+                    else
+                        weights[i, j] = 0;
+                }
+            }
+            return weights;
+        }
+
+        public (int, int) FindMaxWeightPoint(int?[,] weights)
+        {
+            var point = (0, 0);
+            int max = 0;
+            for (int i = 0; i < weights.GetLength(0); i++)
+            {
+                for (int j = 0; j < weights.GetLength(1); j++)
+                {
+                    if (weights[i, j] == null)
+                        return (i, j);
+                    if (weights[i, j] > max)
+                    {
+                        max = (int)weights[i, j];
+                        point = (i, j);
+                    }
+                }
+            }
+            return point;
+        }
+
+        public List<(int, int)> GetPath()
+        {
+            return new List<(int, int)>(path);
+        }
+
+        public override string ToString()
+        {
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < GetLength(0); i++)
+            {
+                for (int j = 0; j < GetLength(1); j++)
+                {
+                    if (this[i, j] == null)
+                        sb.Append("M  ");
+                    else
+                        sb.Append(string.Format("{0,-3}", this[i, j]));
+                }
+                sb.AppendLine();
+            }
+            return sb.ToString();
+        }
+    }
+}

+ 83 - 0
TravMerchant/SolutionNode.cs

@@ -0,0 +1,83 @@
+using System.Collections.Generic;
+using System.Text;
+
+namespace TravMerchant
+{
+    public class SolutionNode
+    {
+        public ReducableMatrix Matrix;
+        public int? Value;
+        public SolutionNode Parent;
+        public SolutionNode Left;
+        public SolutionNode Right;
+
+        public SolutionNode(ReducableMatrix matrix)
+        {
+            Matrix = matrix;
+            Parent = null;
+            Value = matrix.CalculateLowerBound(0);
+        }
+
+        private SolutionNode(ReducableMatrix matrix, SolutionNode parent, int? lastSum, bool recalculate)
+        {
+            Matrix = matrix;
+            Parent = parent;
+            if (recalculate)
+            {
+                Value = matrix.CalculateLowerBound(lastSum);
+            }
+            else
+            {
+                matrix.CalculateLowerBound(lastSum);
+                Value = lastSum;
+            }
+        }
+
+        public bool HasChildren() => Left != null;
+
+        public List<(int, int)> Solve()
+        {
+            var leaf = MinimalLeaf();
+            for (; !leaf.IsSolved(); leaf = MinimalLeaf())
+            {
+                leaf.Calculate();
+            }
+            return leaf.Matrix.GetPath();
+        }
+
+        private SolutionNode MinimalLeaf()
+        {
+            if (HasChildren())
+            {
+                var leftMin = Left.MinimalLeaf();
+                var rightMin = Right.MinimalLeaf();
+                return leftMin.Value > rightMin.Value ? rightMin : leftMin;
+            }
+            return this;
+        }
+
+        public void Calculate()
+        {
+            int?[,] weights = Matrix.CalculateWeights();
+            var point = Matrix.FindMaxWeightPoint(weights);
+
+            var reducedMatrix = Matrix.Reduce(point.Item1, point.Item2);
+
+            var unincludeMatrix = new ReducableMatrix(Matrix);
+            unincludeMatrix[point.Item1, point.Item2] = null;
+
+            Left = new SolutionNode(reducedMatrix, this, Value, true);
+            Right = new SolutionNode(unincludeMatrix, this, Value + weights[point.Item1, point.Item2], false); //3 -- штраф за вес
+        }
+
+        public bool IsSolved()
+        {
+            return Matrix.GetLength(0) == 0;
+        }
+
+        public override string ToString()
+        {
+            return new StringBuilder().Append($"({(Value == null ? "∞" : Value.ToString())})").AppendLine().Append(Matrix.ToString()).ToString();
+        }
+    }
+}

+ 55 - 0
TravMerchant/TravMerchant.csproj

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{A00EF343-7888-4363-B713-7AF9C9B2211E}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>TravMerchant</RootNamespace>
+    <AssemblyName>TravMerchant</AssemblyName>
+    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ReducableMatrix.cs" />
+    <Compile Include="SolutionNode.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>