コード例 #1
0
ファイル: main.cpp プロジェクト: HondaDai/MinimumSpanningTree
	Paths* popPathFrom(string c) {
		Paths* ps = getPathFrom(c);
		for(int i=0;i<ps->size();i++) {
			this->remove(ps->at(i));
		}
		return ps;
	}
コード例 #2
0
ファイル: main.cpp プロジェクト: HondaDai/MinimumSpanningTree
int main(int argc, char** argv)  {

	int n, m;
	int val;
	string c, c1, c2;

	// initialize & input
	cin>>n>>m;
	Citys citys(n);
	Paths paths;
	SpanningPaths spanning_path;

	for(int i=0;i<n;i++) {
		cin >> c;
		citys.setName(i, c);
	}

	for(int i=0;i<m;i++) {
		cin>>c1>>c2>>val;
		paths.push(new Path(c1, c2, val));
	}

	// kruskal's algo
	paths.sortByCost();
	for (int i=0; i<paths.size(); i++) {
		Path* p = paths.at(i);
		if (!spanning_path.existRingIfAdd(p)) {
			spanning_path.push(p->clone());
		}
	}

	int total_cost = 0;
	for (int i=0; i<spanning_path.size(); i++) {
		Path* p = spanning_path.at(i);
		cout << "(" << p->c1 << " " << p->c2 << ") ";
		total_cost += p->cost;
	}
	cout << "\n" << total_cost << endl;

//	paths.list();
//	spanning_path.list();

	return 0;
}
コード例 #3
0
ファイル: main.cpp プロジェクト: HondaDai/MinimumSpanningTree
	bool existRingIfAdd(Path* p) {
		if (this->size() == 0) {
			return false;
		}

		Paths *tmp_path = this->clone();
		string t;

		// BFS
		vector<string> sv, ev;
		sv.push_back(p->c1);
		sv.push_back(p->c2);
		while ( !sv.empty() ) {
			t = sv.back();
			sv.pop_back();
			if ( std::find(ev.begin(), ev.end(), t) != ev.end() ) {
				delete tmp_path;
				return true;
			} else {
				ev.push_back(t);
				Paths* ps = tmp_path->popPathFrom(t);
				for (int i=0;i<ps->size();i++) {
					Path* p = ps->at(i);
					if (p->c1 == t) {
						sv.push_back(p->c2);
					} else {
						sv.push_back(p->c1);
					}
				}
				delete ps;
			}
		}
		delete tmp_path;

		return false;
	}