zadanie z grafów, minimalne drzewo spinające

0

Twoim zadaniem jest wyznaczenie kosztu minimalnego drzewa spinającego grafu nieskierowanego, podanego na wejściu.. Graf ma n wierzchołków (1≤n≤7000) i m krawędzi (1≤m≤300000). Obie liczby podane są w pierwszym wierszu danych.
W kolejnych m wierszach znajdują się opisy krawędzi grafu w postaci trzech liczb a,b,c (oddzielonych spacjami), gdzie 1≤a,b≤n, 1≤c≤100000 oznaczają, że krawedź (a,b) kosztuje c.

mój program wygląda tak i nie działa dla większości testów, proszę o pomoc

#include<iostream>
#include<algorithm>
#include <vector>
#include<queue>
using namespace std;
vector<int> g[7001];
bool od[7001];
int n,m,licznik,wynik;
int t[7001];
queue <int> v;
struct sortowanie
{int w1;
int krawedz;
int w2;
bool operator < (const sortowanie &x)const //zdefiniowanie zachowania si�
  {                //operatora < potrzebnego przy sortowaniu
    return krawedz>x.krawedz;
  }
};
sortowanie tab[300001];
void bfs(int k)
{ int a,b,c;
if(t[tab[licznik].w2]==-1) t[tab[licznik].w2]=tab[licznik].w1;
c=t[tab[licznik].w2];
od[k]=1;
  v.push(k);
   t[k]=c;
   while  (!v.empty())
   {a=v.front();
    v.pop();
    for (int i=0; i<g[a].size(); i++ )
    {b=g[a][i];
    if(od[b]==0)
	 {v.push(b);
	 t[b]=c;
	 od[b]=1;
	 }
    }
	}
}

void wczyt()
{cin>>n>>m;
licznik=0;
int a,b,c;
for(int i=0;i<m;i++)
{cin>>a>>b>>c;
//g[a].push_back(make_pair(b,c));
//g[b].push_back(make_pair(a,c));
tab[licznik].w2=a;
tab[licznik].krawedz=c;
tab[licznik].w1=b;
licznik++;
}
}

int policz()
{ //int ww1,ww2;
    wynik=0;
    for(int y=0;y<=n+1;y++)
    {
    licznik--;
    //cout<<"numer"<<t[tab[licznik].w1]<<" "<<t[tab[licznik].w2];
    if(t[tab[licznik].w1]!=t[tab[licznik].w2]||t[tab[licznik].w2]==-1||t[tab[licznik].w1]==-1)
    {wynik=wynik+tab[licznik].krawedz;
    //cout<<"krawedzie"<<tab[licznik].w1<<" "<<tab[licznik].w2<<"wynik"<<wynik<<endl;
    g[tab[licznik].w1].push_back(tab[licznik].w2);
    g[tab[licznik].w2].push_back(tab[licznik].w1);
    bfs(tab[licznik].w1);

    }
    }
    return wynik;
}


void zeruj()
{for(int i=1;i<=n;i++) t[i]=-1;

}
int main()
{wczyt();
sort(tab,tab+licznik);
zeruj();
cout<<policz()<<endl;
system("pause");
}
1

Podaj pełną treść zadania, ponieważ: - "wyznaczenie kosztu minimalnego drzewa spinającego grafu nieskierowanego" - to jakieś zlepek słów a nie zadanie.

0

Twoim zadaniem jest wyznaczenie kosztu minimalnego drzewa spinającego grafu nieskierowanego, podanego na wejściu.. Graf ma n wierzchołków (1≤n≤7000) i m krawędzi (1≤m≤300000). Obie liczby podane są w pierwszym wierszu danych.
W kolejnych m wierszach znajdują się opisy krawędzi grafu w postaci trzech liczb a,b,c (oddzielonych spacjami), gdzie 1≤a,b≤n, 1≤c≤100000 oznaczają, że krawedź (a,b) kosztuje c.
Przykład

Wejście
6 10
1 2 2
1 6 1
1 5 3
4 1 5
2 6 2
2 3 5
4 3 4
3 5 4
4 5 4
5 6 3
Wyjście
14
tak wygląda cała treść zadania. chodzi o to, żeby wypisać sumę kosztów wszystkich krawędzi grafu spójnego z podanych danych(część krawędzi można usunąć, ale tylko tyle, żeby graf pozostał spójny i żeby suma pozostałych krawędzi była jak najmniejsza i tą sumę trzeba wypisać).

2

Ja rozumiem że chodzi o wyznacznie sumy wag krawędzi minimalnego drzewa spinającego dla danego grafu. Czego nie rozumiem to to czemu ktoś próbuje to zrobić jakimś ultra-WTF kodem zamiast algorytmami które są do tego zadania przystosowane - Prim, Kruskal.

1 użytkowników online, w tym zalogowanych: 0, gości: 1