Neumann_Janos_Verseny/fordulo_3/Program/VirusVoid.cs
2025-03-14 10:51:00 +01:00

239 lines
8.0 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Program
{
internal class VirusVoid
{
public static Dictionary<int, List<int>> Contacts = new Dictionary<int, List<int>>();
public static HashSet<int> InfectedPeople = new HashSet<int>();
public static List<int> uniquePeople = new List<int>();
public static HashSet<int> NewInfectedPeople = new HashSet<int>();
public static void ListAllInfectionTreeVoid()
{
string path = $@"../../../forrasok/elek.txt";
var data = File.ReadAllLines(path);
foreach (var item in data)
{
string[] nums = item.Split(' ');
int infector = Convert.ToInt32(nums[0]);
int infected = Convert.ToInt32(nums[1]);
if (!uniquePeople.Contains(infector))
{
uniquePeople.Add(infector);
}
if (!uniquePeople.Contains(infected))
{
uniquePeople.Add(infected);
}
if (Contacts.ContainsKey(infector))
{
Contacts[infector].Add(infected);
}
else
{
Contacts[infector] = new List<int> { infected };
}
}
InfectedPeople.Clear(); // Clear the set before starting the spread
int infectionTreeCount = 0;
// Spread the virus starting from each unique person if they are not already infected
foreach (var person in uniquePeople)
{
if (!InfectedPeople.Contains(person))
{
infectionTreeCount++;
Virus rootVirus = new Virus(person);
InfectedPeople.Add(person); // Add the root virus to the infected set
SpreadBFS(rootVirus, int.MaxValue); // Spread without depth limit
}
}
Console.WriteLine($"Infected people count: {InfectedPeople.Count}");
Console.WriteLine($"Unique people count: {uniquePeople.Count}");
Console.WriteLine($"Number of infection trees: {infectionTreeCount}");
// Verify if all unique people are infected
bool allInfected = uniquePeople.All(person => InfectedPeople.Contains(person));
Console.WriteLine($"All unique people infected: {allInfected}");
if (!allInfected)
{
var notInfected = uniquePeople.Where(person => !InfectedPeople.Contains(person)).ToList();
Console.WriteLine("People not infected:");
foreach (var person in notInfected)
{
Console.WriteLine(person);
}
}
}
public static void Previous()
{
string path = $@"../../../forrasok/elek.txt";
var data = File.ReadAllLines(path);
foreach (var item in data)
{
string[] nums = item.Split(' ');
int infector = Convert.ToInt32(nums[0]);
int infected = Convert.ToInt32(nums[1]);
if (!uniquePeople.Contains(infector))
{
uniquePeople.Add(infector);
}
if (!uniquePeople.Contains(infected))
{
uniquePeople.Add(infected);
}
if (Contacts.ContainsKey(infector))
{
Contacts[infector].Add(infected);
}
else
{
Contacts[infector] = new List<int> { infected };
}
}
Virus rootVirus = new Virus(2);
InfectedPeople.Clear(); // Clear the set before starting the spread
InfectedPeople.Add(2); // Add the root virus to the infected set
SpreadBFS(rootVirus, 5);
//Spread(rootVirus, 15);
//rootVirus.PrintInfectionTreeWithDepth(2, 0, "->");
rootVirus.PrintInfectionTree();
Console.WriteLine(InfectedPeople.Count);
Console.WriteLine(rootVirus.CountInfectedInDepthRange(3, 10));
Console.WriteLine($"Infected people count: {InfectedPeople.Count}");
Console.WriteLine($"Unique people count: {uniquePeople.Count}");
// Verify if all unique people are infected
bool allInfected = uniquePeople.All(person => InfectedPeople.Contains(person));
Console.WriteLine($"All unique people infected: {allInfected}");
if (!allInfected)
{
var notInfected = uniquePeople.Where(person => !InfectedPeople.Contains(person)).ToList();
Console.WriteLine("People not infected:");
foreach (var person in notInfected)
{
Console.WriteLine(person);
}
}
/*
Virus rootVirus2 = new Virus(2);
int count = 0;
while (NewInfectedPeople.Count != uniquePeople.Count)
{
count++;
SpreadBFS(rootVirus2, count);
}
Console.WriteLine(count);
*/
}
public static void SpreadBFS(Virus rootVirus, int maxDepth)
{
Queue<(Virus virus, int depth)> queue = new Queue<(Virus virus, int depth)>();
queue.Enqueue((rootVirus, 0));
while (queue.Count > 0)
{
var (currentVirus, currentDepth) = queue.Dequeue();
if (currentDepth >= maxDepth)
{
continue;
}
if (Contacts.ContainsKey(currentVirus.Name))
{
foreach (var contact in Contacts[currentVirus.Name])
{
if (!InfectedPeople.Contains(contact))
{
Virus newInfected = new Virus(contact, currentDepth + 1);
currentVirus.Infect(newInfected);
InfectedPeople.Add(contact); // Mark as infected
queue.Enqueue((newInfected, currentDepth + 1));
}
}
}
}
}
public static void Spread(Virus virus, int maxDepth, int currentDepth = 0)
{
if (currentDepth >= maxDepth)
{
return;
}
if (Contacts.ContainsKey(virus.Name))
{
foreach (var contact in Contacts[virus.Name])
{
if (!InfectedPeople.Contains(contact))
{
Virus newInfected = new Virus(contact);
virus.Infect(newInfected);
InfectedPeople.Add(contact); // Mark as infected
Spread(newInfected, maxDepth, currentDepth + 1);
}
else
{
Virus newInfected = new Virus(contact);
virus.Infect(newInfected);
//InfectedPeople.Add(contact); // Mark as infected
Spread(newInfected, maxDepth, currentDepth + 1);
}
}
}
}
/*
public static void Spread(Virus virus)
{
if (Contacts.ContainsKey(virus.Name))
{
foreach (var contact in Contacts[virus.Name])
{
if (!InfectedPeople.Contains(contact))
{
Virus newInfected = new Virus(contact);
virus.Infect(newInfected);
InfectedPeople.Add(contact); // Mark as infected
Spread(newInfected);
}
}
}
}
*/
}
}