hihoCoder1081 最短路径一
题目连接:http://hihocoder.com/problemset/problem/1081
分析:求单源最短路径,点集和边集都不大,邻接矩阵存储即可。
Dijkstra算法实现代码如下:
#include <cstdio>
#include <iostream>
#define INF 999999999
#define MAX 10005
using namespace std;
int s[MAX];
int dist[MAX],ans[MAX][MAX];
void Dijkstra(int n,int v)
{
int newdist,temp,u,i,j;
for(i=1; i<=n; i++)
{
dist[i]=ans[v][i];
s[i]=0;
}
dist[v]=0;
s[v]=1;
for(i=1; i<=n; i++)
{
temp=INF;
u=v;
for(j=1; j<=n; j++)
if((!s[j])&&(dist[j]<temp))
{
u=j;
temp=dist[j];
}
s[u]=1;
for(j=1; j<=n; j++)
if((!s[j])&&(ans[u][j]<INF))
{
newdist=dist[u]+ans[u][j];
if(newdist<dist[j]) dist[j]=newdist;
}
}
}
int main()
{
int m,n,start,end;
int a,b,t;
scanf("%d%d%d%d",&n,&m,&start,&end);
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
ans[i][j]=INF;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&t);
if(ans[a][b]>t)
{
ans[a][b]=t;
ans[b][a]=t;
}
}
Dijkstra(n,start);
printf("%d\n",dist[end]);
return 0;
}
hihoCoder1089 最短路径二:Floyd算法
题目链接:http://hihocoder.com/problemset/problem/1089
分析:题目都已经说的这么明确了==。毕竟,求任意两点之间的最短路Floyd比Dijkstra效率是要高很多。
实现代码如下:
#include <cstdio>
#include <iostream>
#define INF 999999999
#define MAX 1005
using namespace std;
int dist[MAX][MAX];
void Floyd(int n)
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
int temp=dist[i][k]+dist[k][j];
if(dist[i][j]>temp) dist[i][j]=temp;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",dist[i][j]);
printf("\n");
}
}
int main()
{
int m,n;
int a,b,t;
scanf("%d%d",&n,&m);
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
dist[i][j]=INF;
for(int i=0;i<=n;i++) dist[i][i]=0;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&t);
if(dist[a][b]>t)
{
dist[a][b]=t;
dist[b][a]=t;
}
}
Floyd(n);
return 0;
}
hihoCoder1093 最短路径三:SPFA算法
题目链接:http://hihocoder.com/problemset/problem/1093
分析:SPFA不如Dijkstra算法稳定的原因就在于:SPFA对于稀疏图(图中边数较少)有着比较高的效率。本题已经说的很明确了:“鬼屋很大,但道路并不多”,加之m和n的范围比较大,不能用邻接矩阵,这里用vector容器来装了。
实现代码如下:
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x7fffffff
#define MAX 100005
struct edge
{
int to,w;
};
int dis[MAX];
bool vis[MAX];
int n,m,start,e;
vector <edge> vec[MAX];
void SPFA()
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;
vis[i]=false;
}
dis[start]=0;
queue<int> que;
que.push(start);
vis[start]=true;
while(!que.empty())
{
int tmp=que.front();
que.pop();
vis[tmp]=false;
for(int i=0;i<vec[tmp].size();i++)
{
edge cnt=vec[tmp][i];
if(dis[ cnt.to ]>dis[tmp]+cnt.w)
{
dis[ cnt.to ]=dis[tmp]+cnt.w;
if(!vis[ cnt.to ])
{
que.push(cnt.to);
vis[ cnt.to ]=true;
}
}
}
}
}
int main()
{
cin>>n>>m>>start>>e;
for(int i=0;i<=n;i++)
vec[i].clear();
for(int i=1;i<=m;i++)
{
edge cnt1,cnt2;
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
cnt1.to=u;cnt1.w=w;
cnt2.to=v;cnt2.w=w;
vec[u].push_back(cnt2);
vec[v].push_back(cnt1);
}
SPFA();
cout<<dis[e]<<endl;
return 0;
}