模板dijkstra题,随便取个点,找链接他的最短的点,一直找,直到所有点被找到,途中要对新的到这个点的最短的路进行更新
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 205
using namespace std;
int map[N][N];
int dis[N];
int used[N];
int MAXN=20000;
int n,m;
void init()
{
for(int i=0;i<N;i++)
{
used[i]=0;
for(int j=0;j<N;j++)
{
if(j==i) map[i][j]=0;
else map[i][j]=MAXN;
}
}
}
int Dijkstra(int s,int t)
{
for(int i=0;i<n;i++)
{
dis[i]=map[s][i];
}
dis[s]=0;
used[s]=1;
int k;
for(int i=0;i<n;i++)
{
int tmin=MAXN;
for(int j=0;j<n;j++)
{
if(!used[j]&&dis[j]<tmin)
{
tmin=dis[j];
k=j;
}
}
used[k]=1;
for(int j=0;j<n;j++)
{
if(!used[j]&&dis[j]>dis[k]+map[k][j])
dis[j]=dis[k]+map[k][j];
}
}
if(dis[t]==MAXN) return -1;
else return dis[t];
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int a,b,c;
init();
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<map[a][b]) map[a][b]=map[b][a]=c;
}
int sx,ex;
scanf("%d%d",&sx,&ex);
int ans=Dijkstra(sx,ex);
printf("%d\n",ans);
}
return 0;
}
优先队列,和那个想法是一样的,找链接点的最短路,然后更新数组,写这个主要是为了了解priority_queue函数和次短路问题。。。
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define INF 0x3f3f3f
using namespace std;
const int MAXN=1005;
typedef pair<int,int>P;//下一个点,权值
vector<P> map[MAXN];
int dis[MAXN],n;
void dijkstra(int s)
{
for(int i=0;i<=n;i++)
dis[i]=INF;//初始化长度
priority_queue<P>q;//从大到小排序的优先队列
dis[s]=0;//起点到起点的距离是0
q.push(P(s,0));//起点压入队列
while(!q.empty())
{
P pos1=q.top();
q.pop();
int x=pos1.first;//当前节点编号
for(int i=0;i<map[x].size();i++)//看这个节点连了多少个点
{
P pos2=map[x][i];
int y=pos2.first;//下一个链接点编号
if(dis[y]>pos2.second+pos1.second)//数组更新
{
dis[y]=pos1.second+pos2.second;
q.push(P(y,dis[y]));
}
}
}
}
int main()
{
int m,a,b,c;
while(cin>>n>>m)
{
for(int i=0;i<=n;i++)
map[i].clear();//必须清空
for(int i=0;i<m;i++)
{
cin>>a>>b>>c;//a起点,b终点,c权值
map[a].push_back(P(b,c));
map[b].push_back(P(a,c));//无向图
}
int x,y;
cin>>x>>y;
dijkstra(x);
if(dis[y]!=INF)
cout<<dis[y]<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}