UVa11631 Dark Roads(最小生成树,邻接表)
2013-02-17 00:48
441 查看
很裸的一道求最小生成树的题,只是数据很大,要用邻接表来存储
代码:
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = 200010;
const long long INF = 10000000000;
int n, m, id, head
;
long long sum;
struct edge{
int t, next;
int l;
}e[N*2];
long long prim() {
int u = n - 1, v;
long long mi, ans = 0, d
;
bool vis
;
for ( int i = 0; i < n; ++i ) d[i] = INF;
memset(vis, 0, sizeof(vis));
d[0] = 0;
for ( int t = 0; t <= u; ++t ) {
mi = INF;
for ( int i = 0; i < n; ++i ) if ( !vis[i] && d[i] < mi ) {
v = i, mi = d[i];
}
//printf("%d %lld\n", v, mi);
if ( mi == INF ) break;
ans += mi;
vis[v] = true;
for ( int i = head[v]; i != -1; i = e[i].next ) {
int x = e[i].t, c = e[i].l;
if ( !vis[x] && d[x] > c ) d[x] = c;
}
}
return ans;
}
void add( int u, int v, int c ) {
e[id].next = head[u], e[id].t = v, e[id].l = c, head[u] = id++;
e[id].next = head[v], e[id].t = u, e[id].l = c, head[v] = id++;
}
int main()
{
while ( scanf("%d%d", &n, &m) != EOF && !( m == 0 && n == 0 ) ) {
sum = 0, id = 0;
for ( int i = 0; i <= n; ++i ) head[i] = -1;
while ( m-- ) {
int s, t, l;
scanf("%d%d%d", &s, &t, &l);
sum += l;
add( s, t, l );
}
printf("%lld\n", sum - prim());
}
}
代码:
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = 200010;
const long long INF = 10000000000;
int n, m, id, head
;
long long sum;
struct edge{
int t, next;
int l;
}e[N*2];
long long prim() {
int u = n - 1, v;
long long mi, ans = 0, d
;
bool vis
;
for ( int i = 0; i < n; ++i ) d[i] = INF;
memset(vis, 0, sizeof(vis));
d[0] = 0;
for ( int t = 0; t <= u; ++t ) {
mi = INF;
for ( int i = 0; i < n; ++i ) if ( !vis[i] && d[i] < mi ) {
v = i, mi = d[i];
}
//printf("%d %lld\n", v, mi);
if ( mi == INF ) break;
ans += mi;
vis[v] = true;
for ( int i = head[v]; i != -1; i = e[i].next ) {
int x = e[i].t, c = e[i].l;
if ( !vis[x] && d[x] > c ) d[x] = c;
}
}
return ans;
}
void add( int u, int v, int c ) {
e[id].next = head[u], e[id].t = v, e[id].l = c, head[u] = id++;
e[id].next = head[v], e[id].t = u, e[id].l = c, head[v] = id++;
}
int main()
{
while ( scanf("%d%d", &n, &m) != EOF && !( m == 0 && n == 0 ) ) {
sum = 0, id = 0;
for ( int i = 0; i <= n; ++i ) head[i] = -1;
while ( m-- ) {
int s, t, l;
scanf("%d%d%d", &s, &t, &l);
sum += l;
add( s, t, l );
}
printf("%lld\n", sum - prim());
}
}
相关文章推荐
- uva 10816 - Travel in Desert(最小瓶颈生成树+最短路)
- UVALive 4872 Underground Cables 最小生成树
- UVA 11354 Bond(最小生成树+LCA倍增)
- Uva 11631 - Dark roads
- UVALive 3662 Another Minimum Spanning Tree 曼哈顿最小距离生成树
- uva 10099 - The Tourist Guide(最小生成树)
- uva 10048 Audiophobia(最小生成树)
- uva 10369 最小生成树
- UVA 1395 Slim Span 最小生成树
- 最小生成树Prim算法(邻接矩阵和邻接表)
- UVALive - 5713 最小生成树
- uva 10369(最小生成树)
- UVAlive 3662 Another Minimum Spanning Tree 莫队算法,曼哈顿最小生成树
- uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)
- Uva1395 最小生成树
- uva 10397 Connect the Campus(最小生成树)
- Hihocoder 之 #1097 : 最小生成树一·Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)
- (intermediate) 最小生成树 UVA 1504 Genghis Khan the Conqueror
- prim 求最小生成树(邻接表)
- uva 10034(最小生成树)