LA 4080 Warfare A…
2013-12-14 20:03
323 查看
这是一个最短路树的题目 , 这里有一个陷阱 , 有重边 , 如果有重边时必须用第二短的边来代替
。
解法:我们求出一个源点出发的最短路之后 , 我们得到的是一颗树 , 但是这颗树不一定是最小生成树 , 因此如果我们要删除的边在这颗树上
, 那么这个源点出发的最短路径长度就会改变 , 如果不在 ,
那么就肯定不会改变,因此我们就只需要判断这条边是否存在这棵树上。
写代码时 , 一定要头脑清醒 , 不能出一点差错 , 不然 , 到后面来找时 , 很难找到
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXN = 110;
const long long INF = 100000000000000 ;
vectorgrap[MAXN];
long long g[MAXN][MAXN] , g1[MAXN][MAXN];
int n , m , p[MAXN][MAXN] , l = 0;
long long sum1 = 0 , d[MAXN][MAXN];
void init()
{
for(int i =
1 ; i <= n; i++)
grap[i].clear();
memset(g , 0
, sizeof(g));
memset(g1 ,
0 , sizeof(g1));
memset(p , 0
, sizeof(p));
sum1 =
0;
}
long long spfa(int s) // 初始化求所有最短路的和
{
int i ,
done[MAXN] ;
memset(done
, 0 , sizeof(done));
for(i = 1; i
<= n; i++) d[s][i] = INF ;
d[s][s] =
0;
queueq
;
q.push(s); // 队列记录下点
while(!q.empty())
{
int u =
q.front() ; q.pop() ;
done[u] =
0;
for(i = 0 ;
i < grap[u].size() ; i++)
{
int v =
grap[u][i];
if(d[s][v]
> (d[s][u] + g[u][v]))
{
d[s][v] =
d[s][u] + g[u][v];
p[s][v] =
u;
if(!done[v])
{ q.push(v) ; done[v] = 1; }
}
}
}
long long
sum = 0;
for(i = 1; i
<= n; i++)
{
if(d[s][i]
>= INF) //
如果有某个点是孤立点
sum +=
l;
else sum +=
d[s][i] ;
}
return
sum;
}
long long spfa1(int s) // 初始化求所有最短路的和
{
int i ,
done[MAXN] ;
long long
d1[MAXN] , sum = 0 ;
memset(done
, 0 , sizeof(done));
for(i = 1; i
<= n; i++) d1[i] = INF ;
d1[s] =
0;
queueq
;
q.push(s); // 队列记录下点
while(!q.empty())
{
int u =
q.front() ; q.pop() ;
done[u] =
0;
for(i = 0 ;
i < grap[u].size() ; i++)
{
。
解法:我们求出一个源点出发的最短路之后 , 我们得到的是一颗树 , 但是这颗树不一定是最小生成树 , 因此如果我们要删除的边在这颗树上
, 那么这个源点出发的最短路径长度就会改变 , 如果不在 ,
那么就肯定不会改变,因此我们就只需要判断这条边是否存在这棵树上。
写代码时 , 一定要头脑清醒 , 不能出一点差错 , 不然 , 到后面来找时 , 很难找到
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXN = 110;
const long long INF = 100000000000000 ;
vectorgrap[MAXN];
long long g[MAXN][MAXN] , g1[MAXN][MAXN];
int n , m , p[MAXN][MAXN] , l = 0;
long long sum1 = 0 , d[MAXN][MAXN];
void init()
{
for(int i =
1 ; i <= n; i++)
grap[i].clear();
memset(g , 0
, sizeof(g));
memset(g1 ,
0 , sizeof(g1));
memset(p , 0
, sizeof(p));
sum1 =
0;
}
long long spfa(int s) // 初始化求所有最短路的和
{
int i ,
done[MAXN] ;
memset(done
, 0 , sizeof(done));
for(i = 1; i
<= n; i++) d[s][i] = INF ;
d[s][s] =
0;
queueq
;
q.push(s); // 队列记录下点
while(!q.empty())
{
int u =
q.front() ; q.pop() ;
done[u] =
0;
for(i = 0 ;
i < grap[u].size() ; i++)
{
int v =
grap[u][i];
if(d[s][v]
> (d[s][u] + g[u][v]))
{
d[s][v] =
d[s][u] + g[u][v];
p[s][v] =
u;
if(!done[v])
{ q.push(v) ; done[v] = 1; }
}
}
}
long long
sum = 0;
for(i = 1; i
<= n; i++)
{
if(d[s][i]
>= INF) //
如果有某个点是孤立点
sum +=
l;
else sum +=
d[s][i] ;
}
return
sum;
}
long long spfa1(int s) // 初始化求所有最短路的和
{
int i ,
done[MAXN] ;
long long
d1[MAXN] , sum = 0 ;
memset(done
, 0 , sizeof(done));
for(i = 1; i
<= n; i++) d1[i] = INF ;
d1[s] =
0;
queueq
;
q.push(s); // 队列记录下点
while(!q.empty())
{
int u =
q.front() ; q.pop() ;
done[u] =
0;
for(i = 0 ;
i < grap[u].size() ; i++)
{
相关文章推荐
- hdu 2433 最短路树
- 【快速】排序, T(n) = O(nlgn),O(n^2) S(n) = O(lgn) --- 不稳定
- (C# 基础) 类访问修饰符
- LA 3713 Astronauts
- LA 3211 Now or later
- uva 11324
- LA 5135 Mining Your Own Business
- http://kb.cnblogs.com/page/130970/ -http协议
- poj 2942 LA3523 点-双…
- uva 10047
- STL中优先队列的用法
- 并查集及其路径的压缩
- 求欧拉回路的路径 dfs的一种新运用
- poj 2676
- poj 2531
- poj 2251
- poj 2488
- 网络流 SAP优化算法 (…
- 网络流之Dinic算法
- 基于增广路的网络流算法