个人做这题的一些总结
- 构建邻接表的方式
构建边的结构体Edge,包含to和length:
struct Edge{
int to;
int length;
Edge(int t,int l):to(t),length(l){
}
};
由于输入是:点a,点b,长度d(表示a到b之间有一条长为d的路),是一个无向图,固有:
vector<Edge>graph[MAXN];//邻接表实现图 定义
cin>>from>>to>>length;
//因为这里是无向图
graph[from].push_back(Edge(to,length));
graph[to].push_back(Edge(to,length));
- dijkstra算法
定义节点结构体,包含点的编号,点到源点的距离:
struct Point{
int number;//点的编号
int distance;//点到源点的距离
Point(int n,int d):number(n),distance(d){
}
bool operator<(const Point& p)const{
return distance>p.distance;
}
};
具体算法过程如下,这里构造了优先队列:
void Dijkstra(int s)
{
priority_queue<Point> p;//构建优先队列
dis[s]=0;
p.push(Point(s,dis[s]));//源点
while(!p.empty())
{
int u=p.top().number;
p.pop();
for(int i=0;i<graph[u].size();++i)//遍历与点u有边相连的点
{
int v=graph[u][i].to;//和u相连的节点
int d=graph[u][i].length;//u到v的长度
if(dis[v]>dis[u]+d)
{
dis[v]=dis[u]+d;
p.push(Point(v,dis[v]));}
}
}
}
题目大意
输入n m表示城市数 道路数
然后下面m行的格式都是:a b d表示从a到b有一条长为d的路径
然后跟着一行:s t表示计算s到t的最短距离
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int MAXN=200;
const int INF=INT_MAX;
struct Edge{
int to;
int length;
Edge(int t,int l):to(t),length(l){
}
};
struct Point{
int number;//点的编号
int distance;//点到源点的距离
Point(int n,int d):number(n),distance(d){
}
bool operator<(const Point& p)const{
return distance>p.distance;
}
};
vector<Edge>graph[MAXN];//邻接表实现图
int dis[MAXN];//节点到源点的距离
void Initial(int n)
{
memset(graph,0,sizeof(graph));
fill(dis,dis+n,INF);
}
bool cmp(Point a,Point b)
{
return a.distance<b.distance;
}
void Dijkstra(int s)
{
priority_queue<Point> p;//构建优先队列
dis[s]=0;
p.push(Point(s,dis[s]));//源点
while(!p.empty())
{
int u=p.top().number;
p.pop();
for(int i=0;i<graph[u].size();++i)//遍历与点u有边相连的点
{
int v=graph[u][i].to;//和u相连的节点
int d=graph[u][i].length;//u到v的长度
if(dis[v]>dis[u]+d)
{
dis[v]=dis[u]+d;
p.push(Point(v,dis[v]));}
}
}
}
int main()
{
int n,m;//城数 道路数
while(cin>>n>>m)
{
Initial(n);//初始化
while(m--)
{
int from,to,length;
cin>>from>>to>>length;
//因为这里是无向图
graph[from].push_back(Edge(to,length));
graph[to].push_back(Edge(to,length));
}
int s,t;
cin>>s>>t;//起点和终点
Dijkstra(s);
if(dis[t]==INF) cout<<"-1"<<endl;
else cout<<dis[t]<<endl;
}
return 0;
}