最短路常用的四种模板(poj1847)

针对于poj1847这道题,总结一下最短路常用的四种模板.
**

Floyed(O(n^3))

**

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

const int maxx=1e2+10;
int mp[maxx][maxx];
int n,s,e;

inline void floyed()//!!!核心代码
{
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++) mp[i][j]=min(mp[i][k]+mp[k][j],mp[i][j]);
		}
	}
}
int main()
{
	scanf("%d%d%d",&n,&s,&e);
	int num,x;
	memset(mp,inf,sizeof(mp));
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&num);
		for(int j=1;j<=num;j++)
		{
			scanf("%d",&x);
			if(j==1) mp[i][x]=0;
			else mp[i][x]=1;
		}
	}
	floyed();
	if(mp[s][e]==inf) cout<<"-1"<<endl;
	else cout<<mp[s][e]<<endl;
	return 0;
}

**

Dijkstra(O(n^2))

**

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

const int maxx=1e2+10;
int mp[maxx][maxx];
int dis[maxx];
int vis[maxx];
int n,s,e;

inline void dijkstra(int u)//核心代码
{
	memset(dis,inf,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[u]=0;
	for(int k=1;k<=n;k++)
	{
		int _min=inf,v;
		for(int i=1;i<=n;i++)
		{
			if(vis[i]) continue;
			if(dis[i]<_min) _min=dis[i],v=i;
		}
		vis[v]=1;
		for(int i=1;i<=n;i++)
		{
			if(mp[v][i]!=inf&&vis[i]==0) dis[i]=min(dis[i],dis[v]+mp[v][i]);
		}
	}
}
int main()
{
	scanf("%d%d%d",&n,&s,&e);
	int num,x;
	memset(mp,inf,sizeof(mp));
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&num);
		for(int j=1;j<=num;j++)
		{
			scanf("%d",&x);
			if(j==1) mp[i][x]=0;
			else mp[i][x]=1;
		}
	}
	dijkstra(s);
	if(dis[e]==inf) cout<<"-1"<<endl;
	else cout<<dis[e]<<endl;
	return 0;
}

**

Dijkstra(O(nlogn))

**

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

const int maxx=1e2+10;
struct node{
	int to,v;
	node(){}
	node(int a,int b)
	{
		to=a,v=b;
	}
	bool operator<(const node &a)const{
		return v>a.v;
	}
};
int mp[maxx][maxx];
int dis[maxx];
int vis[maxx];
int n,s,e;

inline void dijkstra(int u)//核心代码
{
	memset(dis,inf,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[u]=0;
	priority_queue<node> q;
	q.push(node(u,0));
	while(q.size())
	{
		node a=q.top();
		q.pop();
		if(vis[a.to]) continue;
		vis[a.to]=1;
		for(int i=1;i<=n;i++)
		{
			if(mp[a.to][i]!=inf&&dis[i]>dis[a.to]+mp[a.to][i])
			{
				dis[i]=dis[a.to]+mp[a.to][i];
				q.push(node(i,dis[i]));
			}
		}
	}
}
int main()
{
	scanf("%d%d%d",&n,&s,&e);
	int num,x;
	memset(mp,inf,sizeof(mp));
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&num);
		for(int j=1;j<=num;j++)
		{
			scanf("%d",&x);
			if(j==1) mp[i][x]=0;
			else mp[i][x]=1;
		}
	}
	dijkstra(s);
	if(dis[e]==inf) cout<<"-1"<<endl;
	else cout<<dis[e]<<endl;
	return 0;
}

**

Spfa(未知)

**

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

const int maxx=1e2+10;
int mp[maxx][maxx];
int dis[maxx];
int vis[maxx];
int n,s,e;

inline void spfa(int u)//核心代码
{
	queue<int> q;
	memset(vis,0,sizeof(vis));
	memset(dis,inf,sizeof(dis));
	vis[u]=1;
	dis[u]=0;
	q.push(u);
	while(q.size())
	{
		int v=q.front();
		q.pop();
		vis[v]=0;
		for(int i=1;i<=n;i++)
		{
			if(mp[v][i]!=inf)
			{
				if(dis[i]>dis[v]+mp[v][i])
				{
					dis[i]=dis[v]+mp[v][i];
					if(vis[i]==0)
					{
						vis[i]=1;
						q.push(i);
					}
				}
			}
		}
	}
}
int main()
{
	scanf("%d%d%d",&n,&s,&e);
	int num,x;
	memset(mp,inf,sizeof(mp));
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&num);
		for(int j=1;j<=num;j++)
		{
			scanf("%d",&x);
			if(j==1) mp[i][x]=0;
			else mp[i][x]=1;
		}
	}
	spfa(s);
	if(dis[e]==inf) cout<<"-1"<<endl;
	else cout<<dis[e]<<endl;
	return 0;
}

努力加油a啊,(o)/~

发布了596 篇原创文章 · 获赞 47 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/starlet_kiss/article/details/105097943
今日推荐