您的位置:首页 > 其它

Poj 2387 Til the Cows Come Home (dijkstra + 判重)

2018-01-23 20:11 225 查看
题意:给你一个无向图,让你求1到n的最短距离。

题解:题目描述的很清楚,但是这道题有点小坑,就是两个点之间会有多条边。对于多条边,我们存最小的即可了。然后裸的一个dijkstra就可以了。详情看代码注解

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 2005; //点的个数
const int inf = 1e9;

int map[maxn][maxn]; // 邻接矩阵
int n,m;

void dijkstra(){
int minn ,v;
int dis[maxn];
bool vis[maxn];
for(int i = 1 ; i <= n ; i++){ // 初始化
vis[i] = 0;
dis[i] = map[1][i];
}
for(int i = 1; i <= n ; i++ ){
minn = inf;
for(int j = 1;j <= n ; j ++){ // 找出最短边
if(!vis[j] && dis[j] < minn){
v = j;
minn = dis[j];
}
}
vis[v] = 1;
for(int j = 1; j <= n ; j ++) // 松弛
if(!vis[j] && dis[j] > dis[v] + map[v][j])
dis[j] = dis[v] + map[v][j];
}
cout << dis
<< endl;
}
int main(){
while(~scanf("%d%d",&m,&n)){ //初始化
for(int i = 1; i <= n ; i++)
for(int j = 1;j <= n ; j ++)
if(i == j)
map[i][j] = 0;
else
map[i][j] = map[j][i] = inf;
int u,v,w;
for(int i = 1; i <= m ; i++){ //读入边
cin >> u >> v >> w;
if(map[u][v] > w) // 判重
map[u][v] = map[v][u] = w;
}
dijkstra();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: