王道_例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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45019830/article/details/115033941