poj 1135 有点弯的最短路运用
2013-12-14 20:05
393 查看
题意:有n个关键骨牌 , 每个两个相连的关键骨牌之间有一些普通牌 , 然后下面给出 m 行数据 , 每行有3个整数 a b t ,
表示从关键骨牌a、b之间连有一些普通牌 , 并且从a倒向b需要时间t ,
要求出最后开始倒下的哪一张张牌、什么时候开始倒下 。 最后开始倒下的有可能是一张关键骨牌 , 或是两张关键骨牌中间的某一张普通骨牌
。
解法:我们首先要求出每个关键骨牌开始倒下的最短(最早)时间 , 然后求出每两个关键骨牌之间所有普通骨牌倒下的时间 ,
然后求它们的最大值 。
注意:如果是两张关键骨牌中间的某一张普通骨牌最后倒下 , 那么我输出的时候是输出这两张关键骨牌 ,
并且它们的序号必须是从小到大。
代码:
#include
#include
#include
#include
using namespace std;
#define max(u , v) (u)>(v)?(u):(v)
#define min(u , v)
(u)<(v)?(u):(v)
const int INF = 0xfffffff;
const int maxn = 510;
int grap[maxn][maxn] , dist[maxn] , pre[maxn];
int n , m ;
void init()
{
int i ,
j;
for(i = 1; i
<= n; i++)
for(j = 1; j
<= n; j++)
grap[i][j] =
INF;
memset(pre ,
0 , sizeof(pre));
}
bool cmp(int x , int y)
{
return
dist[x]
}
void dijkstra()
{
int i ,
j;
for(i = 1; i
<= n; i++)
dist[i] =
grap[1][i];
pre[1] =
1;
dist[1] =
0;
int x =
1;
for(j = 1; j
< n; j++)
{
int maxs =
INF;
for(i = 1; i
<= n; i++)
if(!pre[i]
&& dist[i] < maxs)
{
maxs =
dist[i];
x = i;
}
pre[x] =
1;
for(i = 1; i
<= n; i++)
if(!pre[i]
&& dist[x]+grap[x][i] < dist[i])
dist[i] =
dist[x] + grap[x][i];
}
}
int main()
{
int gh =
1;
while(scanf("%d %d" , &n , &m) != EOF)
{
if(n == 0
&& m == 0) break;
init();
int i , j ,
x , y , t;
for(i = 1; i
<= m; i++)
{
scanf("%d %d
%d" , &x , &y , &t);
grap[x][y] =
grap[y][x] = t;
}
dijkstra();
for(i = 0; i
<= n; i++)
pre[i] =
i;
表示从关键骨牌a、b之间连有一些普通牌 , 并且从a倒向b需要时间t ,
要求出最后开始倒下的哪一张张牌、什么时候开始倒下 。 最后开始倒下的有可能是一张关键骨牌 , 或是两张关键骨牌中间的某一张普通骨牌
。
解法:我们首先要求出每个关键骨牌开始倒下的最短(最早)时间 , 然后求出每两个关键骨牌之间所有普通骨牌倒下的时间 ,
然后求它们的最大值 。
注意:如果是两张关键骨牌中间的某一张普通骨牌最后倒下 , 那么我输出的时候是输出这两张关键骨牌 ,
并且它们的序号必须是从小到大。
代码:
#include
#include
#include
#include
using namespace std;
#define max(u , v) (u)>(v)?(u):(v)
#define min(u , v)
(u)<(v)?(u):(v)
const int INF = 0xfffffff;
const int maxn = 510;
int grap[maxn][maxn] , dist[maxn] , pre[maxn];
int n , m ;
void init()
{
int i ,
j;
for(i = 1; i
<= n; i++)
for(j = 1; j
<= n; j++)
grap[i][j] =
INF;
memset(pre ,
0 , sizeof(pre));
}
bool cmp(int x , int y)
{
return
dist[x]
}
void dijkstra()
{
int i ,
j;
for(i = 1; i
<= n; i++)
dist[i] =
grap[1][i];
pre[1] =
1;
dist[1] =
0;
int x =
1;
for(j = 1; j
< n; j++)
{
int maxs =
INF;
for(i = 1; i
<= n; i++)
if(!pre[i]
&& dist[i] < maxs)
{
maxs =
dist[i];
x = i;
}
pre[x] =
1;
for(i = 1; i
<= n; i++)
if(!pre[i]
&& dist[x]+grap[x][i] < dist[i])
dist[i] =
dist[x] + grap[x][i];
}
}
int main()
{
int gh =
1;
while(scanf("%d %d" , &n , &m) != EOF)
{
if(n == 0
&& m == 0) break;
init();
int i , j ,
x , y , t;
for(i = 1; i
<= m; i++)
{
scanf("%d %d
%d" , &x , &y , &t);
grap[x][y] =
grap[y][x] = t;
}
dijkstra();
for(i = 0; i
<= n; i++)
pre[i] =
i;
相关文章推荐
- poj 1079 判断最…
- poj 1258 简单的prim算法运用
- poj 2031 简单的kruskal算法运用
- poj1823,3667
- poj 1465 一题非常经典的bfs题
- hdu 1026 简单的bfs
- hdu1728 很有难度的bfs…
- poj 1733 并查集+偏移向…
- poj 1182 并查集经典题…
- poj 1611 并查集训练
- poj 1703 并查集的拓展
- HDU 4277 USACO ORZ
- poj 1836 最长增长序列的变形
- 集合中子集的生成算法
- poj 1742
- LA 4726 Average
- 动态规划求 最长递增子序列
- 01背包和完全背包比较容易忽略的地…
- Distant Galaxy poj 3141
- unipue() 函数的功能