王道_例11.6畅通工程续(dijkstra 构造邻接图)

个人做这题的一些总结

  • 构建邻接表的方式

构建边的结构体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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值