P1139(未完,不知名的错误)

洛谷上这个题的题解还是比较好的,可以借鉴下。 

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=6201;
const int maxv=2501;
const int inf=(1<<31)-1;
vector<int> V[maxn],w[maxn];
int dis[maxv];
int n,m,s,t;
bool visit[maxv]={false};
//没有用堆优化,所以可能会超时O(n^2)
/*
所以问题又来了,如果用堆优化的话,那两种方法怎么写来着??? 
*/ 
struct Node
{
	int v,cost;
};
bool operator < (Node a,Node b)
{
	return a.cost>b.cost;
}
void Dijkstra()
{
	priority_queue<Node> q;
	for(int i=1;i<=n;i++) dis[i]=inf;
	dis[s]=0;
//	for(int i=0;i<V[s].size();i++) 
//	{
//		int tmp=V[s][i];
//		dis[tmp]=w[s][i];//dis数组初始化 
//	}
	
	Node tn;
	tn.v=s; tn.cost=0;
	q.push(tn);
	while(!q.empty())
	{
		//cout<<"*\n";
		Node t=q.top();
		q.pop();
		int u=t.v;
		if(visit[u]) continue;
		visit[u]=true;
		
		for(int i=0;i<V[u].size();i++)
		{
			//cout<<"^\n";
			if(dis[V[u][i]]>dis[u]+V[u][i])
			{
				dis[V[u][i]]=dis[u]+w[u][i];
				tn.v=V[u][i];
				tn.cost=dis[V[u][i]];
				q.push(tn);
				//cout<<"$$\n";
			}
		} 
	}

}
void Print()
{
	for(int i=1;i<=n;i++) cout<<dis[i]<<" ";
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>s>>t;
	int a,b,c;
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b>>c;
		V[a].push_back(b);
		V[b].push_back(a);
		w[a].push_back(c);
		w[b].push_back(c);
	}
	Dijkstra();
	cout<<dis[t];
//	Print();
	return 0;
}

用堆来优化的话,dis数组在初始化时,不能将与源点相邻的点的距离直接改好,都置为inf就好了。要不然,在后面循环的时候与源点直接相邻的点不会进队,也就没法求最短路了。

发布了77 篇原创文章 · 获赞 11 · 访问量 4989

猜你喜欢

转载自blog.csdn.net/qq_43346054/article/details/103491001