poj1847(Dijkstra)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26760433/article/details/84503427

如果会Dijstra算法,这题水水的。就是题意有点难懂。
Sample Input
3 2 1
2 2 3
2 3 1
2 1 2
第一行,表示有3个顶点,求从2走向1的最短路径。
第二行,表示从顶点1发出两条边,默认通向顶点2路径长度为0,通向顶点3路径长度为1.(不是默认通向的顶点路径长度为1)
第三行,表示从顶点2发出两条边,默认通向顶点3路径长度为0,通向顶点1路径长度为1.
第四行,表示从顶点3发出两条边,默认通向顶点1路径长度为0,通向顶点2路径长度为1.
最忧路径为 2->3->1
代码

#include<vector>
#include<queue>
#include<iostream>
using namespace std;

class road
{
public:
	int end;
	int weight;
};
class Graph
{
public:
	int v;
	vector<road> *adj;
	int *mark;

	Graph(int n);
	~Graph();
	void addEdge(int s,int e,int w);
};
Graph::Graph(int n)
{
	v=n;
	adj=new vector<road>[n];
	mark=new int[n];
	for(int i=0;i<n;i++)
		mark[i]=0;
}
Graph::~Graph()
{
	delete []mark;
	delete []adj;
}
void Graph::addEdge(int s,int e,int w)
{
	road r;
	r.end=e;
	r.weight=w;
	adj[s].push_back(r);
}
class Dist
{
public:
	int index;
	int length;
	int pre;
	friend bool operator<(const Dist & a,const Dist &b)
	{
		return a.length>b.length;
	}
};
void Dijkstra(Graph & g,int s,int e)
{
	Dist *D = new Dist[g.v];
	for(int i=0;i<g.v;i++)
	{
		D[i].index = i;
		D[i].length=1<<30;
		D[i].pre = s;
	}
	D[s].length = 0;
	priority_queue<Dist> aqueue;
	aqueue.push(D[s]);

	for(int i=0;i<g.v;i++)
	{
		Dist d;
		bool FOUND;
		FOUND=false;
		while(!aqueue.empty())
		{
			d=aqueue.top();
			aqueue.pop();
			if(g.mark[d.index]==0)
			{
				FOUND=true;
				break;
			}
		}
		if(!FOUND)
			break;
		g.mark[d.index]=1;
		int node=d.index;
		vector<road>::iterator ii=g.adj[node].begin();
		for(;ii!=g.adj[node].end();ii++)
		{
			if( D[ii->end].length> D[node].length + ii->weight)
			{
				D[ii->end].length = D[node].length + ii->weight;
				D[ii->end].pre=node;
				aqueue.push(D[ii->end]);
			}
		}
	}
	if(D[e].length==1<<30)
		cout<<"-1"<<endl;
	else
		cout<<D[e].length<<endl;
}
int main()
{
	int begin,end;
	int num_node;

	int temp;
	int flag;
	int now_end;
	cin>>num_node>>begin>>end;
	begin=begin-1;
	end=end-1;
	Graph g(105);
	for(int i=0;i<num_node;i++)
	{
		flag=0;
		cin>>temp;
		while(temp--)
		{
			cin>>now_end;
			if(flag==0)
			{
				g.addEdge(i,now_end-1,0);
				flag=1;
			}
			else
				g.addEdge(i,now_end-1,1);

		}
	}
	Dijkstra(g,begin,end);
}

猜你喜欢

转载自blog.csdn.net/qq_26760433/article/details/84503427