G级光纤:农夫约翰当上村长,要给全村建光纤,求最小花费?
2.5 它们其实都是“图”
最小生成树
水题一道。今天看到有人做中文分词的时候自己实现哈希表,导致整个分词速度只有170kb/s,明明用个DATrie树轻松上兆的嘛。
#ifndef ONLINE_JUDGE #pragma warning(disable : 4996) #endif #include <iostream> #include <vector> #include <queue> #include <functional> using namespace std; #define MAX_V 1024 int mincost[MAX_V]; // 从集合X出发的边到每个顶点的最小权值 bool used[MAX_V]; // 顶点i是否包含在集合X中 int V; // 顶点数 // first 最短路径,second顶点编号 typedef pair<int, int> P; struct edge { int to, cost; edge(int to = 0, int cost = 0) : cost(cost), to(to) {} }; // 边 vector<edge> G[MAX_V]; // G[i] 顶点i到G[i].to的权值为G[i].cost int prim() { int res = 0; memset(mincost, 0x3f, V * sizeof(int)); memset(used, 0, V * sizeof(bool)); mincost[0] = 0; priority_queue<P, vector<P>, greater<P> > que; que.push(P(0, 0)); while (!que.empty()) { P p = que.top(); que.pop(); int v = p.second; if (used[v] || p.first > mincost[v]) continue; used[v] = true; res += mincost[v]; for (int i = 0; i < G[v].size(); ++i) { edge e = G[v][i]; if (mincost[e.to] > e.cost) { mincost[e.to] = e.cost; que.push(P(mincost[e.to], e.to)); } } } return res; } ///////////////////////////SubMain////////////////////////////////// int main(int argc, char *argv[]) { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif while (cin >> V && V) { for (int i = 0; i < V; ++i) { G[i].clear(); for (int j = 0; j < V; ++j) { int cost; cin >> cost; G[i].push_back(edge(j, cost)); } } cout << prim() << endl; } #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); system("out.txt"); #endif return 0; } ///////////////////////////End Sub//////////////////////////////////