Помогите, нужна программа по определению компонент двусвязности Графа.
Есть программа на СИ, может кто то поможет ее переделать?
как задан граф хотя бы написала бы...
как вам угодно
Пжлста, вот, то, что есть на СИ:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace DvusvyaZannost
{ public partial class Form1 : Form
{ public Form1()
{ InitializeComponent();
}
public static int y = 10, x = 5, startind;
private void button1_Click(object sender, EventArgs e)
{ }
private void Form1_Load(object sender, EventArgs e)
{ }
private void menuItem2_Click(object sender, EventArgs e)
{
int[,] mas = new int[textBox1.Lines.Length, textBox1.Lines.Length];
int[] per = new int[textBox1.Lines.Length];
ArrayList al = new ArrayList(10);
for (int i = 0; i < textBox1.Lines.Length; i++)
{
string str = (textBox1.Lines[i]).Trim();
string[] st = str.Split(' ');
for (int j = 0; j < textBox1.Lines.Length; j++)
{
mas[i, j] = int.Parse(st[j].Trim());
if (mas[i, j] == 1) per[i]++;
} }
int kol = 0,min = 10;
for (int i = 0; i < per.Length; i++)
{
if (per[i] == 1) kol++;
}
int[,] masx = new int[textBox1.Lines.Length - kol, textBox1.Lines.Length - kol];
int coaf = 0;
for (int i = 0; i < textBox1.Lines.Length; i++)
{
if (per[i] == 1)
{
for (int j = 0; j < textBox1.Lines.Length; j++)
{
if (mas[i, j] == 1)
{
coaf = j;
for (int g = 0; g < textBox1.Lines.Length - kol; g++)
{
if (g == i) i++;
for (int h = 0; h < textBox1.Lines.Length - kol; h++)
{
if (j == h) j++;
masx[g, h] = mas[i, j];
}}}
pictureBox1.Refresh();
Graphics gr = pictureBox1.CreateGraphics();
SolidBrush brh=new SolidBrush(Color.Red);
Font fr=new Font("Times New Roman",15);
string s = "т. " + coaf.ToString() + " т. двусвязанности";
gr.DrawString(s, fr, brh, new Point(x, y));
y += 15;
s=i.ToString()+" "+coaf.ToString()+" компонента двусвяз";
gr.DrawString(s, fr, brh, new Point(x, y));
y += 15;
gr.Dispose();
}}
int indnext = 0, indput = 0;
int[] put = new int[textBox1.Lines.Length];
for (int i = 0; i < (textBox1.Lines.Length - kol); i++)
{
for (int j = 0; j < (textBox1.Lines.Length - kol); j++)
{
if (masx[i, j] == 1)
{
indnext = j;
break;
}}
put[indput] = indnext;
indput++;
for (int j = 0; j < (textBox1.Lines.Length - kol); j++)
{
if (masx[indnext, j] == 1 && per[j] > per[indnext] && indnext != j)
{
indnext = j;
}}
for (int j = 0; j < indput; j++)
{
if (put[j] == indnext)
{
goto End;
}}}
End: Graphics grt = pictureBox1.CreateGraphics();
SolidBrush br = new SolidBrush(Color.Red);
Font f = new Font("Times New Roman", 14);
string strt = "т. " + indnext.ToString() + " т. двусвязанности";
grt.DrawString(strt, f, br, new Point(x, y));
y += 15;
string strok="";
for (int i = 0; i < indnext; i++)
{
if (mas[indnext, i] == 1)
{
strok += " " + i.ToString();
}}
strok =indnext+strok+" компонента двусвяз.";
strok.TrimStart();
grt.DrawString(strok, f, br, new Point(x, y));
y += 15;
strok="";
for (int i = indnext; i < (textBox1.Lines.Length - kol); i++)
{
if (mas[indnext, i] == 1)
{
strok +=" "+i.ToString();
}}
strok = indnext.ToString() + strok+" компонента двусвяз.";
grt.DrawString(strok, f, br, new Point(x, y));
}
private void menuItem5_Click(object sender, EventArgs e)
{
AboutBox ab = new AboutBox();
ab.ShowDialog();
}
private void menuItem3_Click(object sender, EventArgs e)
{
this.Close();
}}}
Не поможете ?
ты думаешь, это реально прочитать?
вот такое нагромождение строк без отступов?
что-то у меня вообще сомнения, что это за язык...
Если расскажешь алгоритм, могу сказать, правильно или нет
это c#
program svyazniye_componenti;это не перевод твоего кода ,это я на винте нарыл.
const nVert = 100;
nAdj = 1000;
type TVert = array[1..nVert]of integer;
tAdj = array[1..nAdj]of integer;
var f : text;
n : integer;
adj : TAdj;
fst ,nbr ,vtx ,mark : TVert;
i ,j : integer;
yes : boolean;
procedure init(var yes : boolean);
var i ,j ,m : integer;
begin
for i := 1 to n do
for j := 1 to nbr[i] do
begin
yes := false;
for m := 1 to n do
if adj[fst[i] + j] = vtx[m] then
begin
yes := true;
adj[fst[i] + j] := m;
break;
end;
if not yes then exit;
end;
end;
procedure component(x ,count : integer);
var i ,v : integer;
begin
mark[x] := count;
for i := 1 to nbr[x] do
begin
v := adj[fst[x] + i];
if mark[v] = 0 then component(v,count);
end;
end;
procedure conn;
var v ,count : integer;
begin
for v := 1 to n do mark[v] := 0;
count := 0;
for v := 1 to n do
if mark[v] = 0 then
begin
count := count + 1;
component(v,count);
end
end;
begin
assign(f ,'sv_comp.in');reset(f);
read(f,n);
fst[1] := 0;
for i := 1 to n do
begin
read(f ,vtx[i]);
read(f ,nbr[i]);
for j := 1 to nbr[i] do
read(f ,adj[fst[i] + j]);
fst[i + 1] := fst[i] + nbr[i];
end;
close(f);
assign(f ,'sv_comp.out');rewrite(f);
init(yes);
if not yes then
begin
writeln(f ,'error');
close(f);
exit;
end;
conn;
for i := 1 to n do write(f ,vtx[i] : 3);writeln(f);
for i := 1 to n do write(f ,mark[i] : 3);
close(f);
end.
virt, ну, если не трудно, объясни, пожалуйста, т.к. я с графами не очень дружу )
Пожалуйста, надо уже срочно...
Ну подскажи немного... оч надо, пожалуйста
program svyazniye_componenti;это не перевод твоего кода ,это я на винте нарыл.
Горю!!
В этом разделе решают вместе. Код, который ты кинула - во-первых, действительно страшненький, во-вторых, явно вырезан из проекта и сам по себе и близко не рабочий (хотя бы потому, что обработчики событий типа menuItem2_Click должны быть подписаны на эти события, и в коде я этого не вижу). А в третьих, ты его кинула, и сказала - "помогите". Если у тебя что-то не получается, но ты представляешь, как решать задачу - спроси, попробуем помочь. Если не представляешь - спроси, расскажем алгоритм. Если хочешь чтоб за тебя просто выполнили работу - тебе в раздел "http://forum.pascal.net.ru/index.php?showforum=14".