最短路 HDU - 2544 (邻接矩阵存图 && vector 存图 Dijkstra + SPFA)
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
主要是想熟练一下用vector存储地图, 顺道复习一下最短路
这个代码是用邻接矩阵存哒:
#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 1000000;
int book[maxn] , data[100][100] , dis[maxn];
int n , m , minn , u;
void Dijkstra()
{
for(int i = 1 ; i <= n-1 ; i++)
{
minn = maxn;
for(int j = 1 ; j <= n ; j++)
{
if(book[j] == 0 && dis[j] < minn)
{
minn = dis[j];
u = j;
}
}
book[u] = 1;
for(int k = 1 ; k <= n ; k++)
{
if(data[u][k] < maxn)
{
if(dis[k] > dis[u] + data[u][k])
{
dis[k] = dis[u] + data[u][k];
}
}
}
}
}
int main()
{
int a , b , c;
while(~scanf("%d %d" , &n , &m) && ( n + m ))
{
memset(book , 0 , sizeof(book));
memset(dis , 0 , sizeof(dis));
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
if(i == j)
{
data[i][j] = 0;
}
else
{
data[i][j] = maxn;
}
}
}
while(m--)
{
cin >> a >> b >> c;
data[a][b] = data[b][a] = c;
}
for(int i = 1 ; i <= n ; i++)
{
book[i] = 0;
}
book[1] = 1;
for(int i = 1 ; i <= n ; i++)
{
dis[i] = data[1][i];
}
Dijkstra();
// for(int i = 1 ; i <= n ; i++)
// {
printf("%d\n" , dis[n]);
// }
}
return 0;
}
介个代码是用vector存哒
#include <stdio.h>
#include <cstring>
#include <vector>
#include <iostream>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 1000000;
int book[maxn] , dis[maxn];
int n , m , minn , u;
struct node
{
int to;
int cost;
node(int _to,int _cost):to(_to), cost(_cost) {}
};
vector<node>V[maxn];
void Dijkstra()
{
for(int i = 1 ; i <= n-1 ; i++)
{
minn = maxn;
for(int j = 1 ; j <= n ; j++)
{
if(book[j] == 0 && dis[j] < minn)
{
minn = dis[j];
u = j;
}
}
// printf("U = %d\n",u);
book[u] = 1;
for(int k = 0 ; k < V[u].size() ; k++)
{
int v = V[u][k].to;
int w = V[u][k].cost;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
}
}
}
}
int main()
{
int temp1;
while(~scanf("%d %d" , &n , &m) && ( n + m ))
{
memset(book , 0 , sizeof(book));
int u,v,cost;
// memset(dis , 0 , sizeof(dis));
for(int i = 0 ; i < maxn ; i++) V[i].clear();
while(m--)
{
scanf("%d %d %d" , &u , &v , &cost);
V[u].push_back(node(v,cost));
V[v].push_back(node(u,cost));
}
for(int i = 1 ; i <= n ; i++)
{
book[i] = 0;
}
book[1] = 1;
memset(dis,INF,sizeof(dis));
for(int i = 0 ; i < V[1].size() ; i++)
{
dis[V[1][i].to] = V[1][i].cost;
}
dis[1] = 0;
Dijkstra();
// for(int i = 1 ; i <= n ; i++)
// {
printf("%d\n" , dis[n]);
// }
}
return 0;
}
介个是SPFA的代码:
#include<stdio.h>
#include <iostream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e5+10;
int dis[maxn] , vis[maxn] , ans[maxn];
int n , m;
struct node
{
int to;
int cost;
node(int _to , int _cost):to(_to) , cost(_cost){
}
};
vector<node>V[maxn];
bool SPFA(int s , int e)
{
for(int i = 0 ; i <= n ; i++)
{
dis[i] = INF;
}
dis[s] = 0;
queue<int>q;
q.push(s);
ans[s] = 1;
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = 0;
for(int i = 0 ; i < V[u].size() ; i++)
{
int to = V[u][i].to;
int w = V[u][i].cost;
if(dis[to] > dis[u] + w)
{
dis[to] = dis[u] + w;
if(!vis[to])
{
vis[to] = 1;
ans[to]++;
q.push(to);
if(ans[to] > e)
{
return false;
}
}
}
}
}
return true;
}
int main()
{
while(~scanf("%d %d" , &n , &m) && (n+m))
{
for(int i = 0 ; i < n ; i++)V[i].clear();
while(m--)
{
int u , v , cost;
scanf("%d %d %d" , &u , &v , &cost);
V[u].push_back(node(v , cost));
V[v].push_back(node(u , cost));
}
SPFA(1,n);
printf("%d\n",dis[n]);
}
return 0 ;
}