朴素:
#include<cstdio>
using namespace std;
const int inf=1e9;
int map[102][102],dis[102];
bool mark[102];
int main()
{
int x,y,n,m,a,b;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
scanf("%d",&map[a][b]);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i!=j&&map[i][j]==0) map[i][j]=inf;
}
scanf("%d%d",&x,&y);
for(int i=1;i<=n;i++)
{
mark[i]=false;
dis[i]=map[x][i];
}
mark[x]=true;
int minn,k;
do
{
minn=inf;
k=0;
for(int i=1;i<=n;i++)
{
if(mark[i]==false&&dis[i]<minn)
{
minn=dis[i];
k=i;
}
}
if(k>0)
{
mark[k]=true;
for(int i=1;i<=n;i++)
{
if(dis[i]>dis[k]+map[k][i]) dis[i]=dis[k]+map[k][i];
}
}
}
while(k>0);
printf("%d",dis[y]);
}
堆优化:
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
const int needn=103;
const int needm=4530;
const int inf=1e9;
struct fy
{
int len,en,la;
fy(int len=0,int en=0,int la=0) {this->len=len,this->en=en,this->la=la;}
};
struct yf
{
int dis,nu;
yf(int a=0,int b=0) {this->dis=a,this->nu=b;}
};
struct cmp
{
bool operator() (yf a,yf b)
{
if(a.dis==b.dis) return a.nu>b.nu;
return a.dis>b.dis;
}
};
typedef priority_queue<yf,vector<yf>,cmp> smg;
smg q;
fy w[needm];
int n,m,s,e,tot;
int dis[needn],fi[needn];
bool vis[needn];//已找到该点最短路时才标记
void add(int a,int b,int c)
{
tot++;
w[tot]=fy(c,b,fi[a]);
fi[a]=tot;
}
int dijkstra(int s,int e)
{
for(int i=1;i<=n;i++)
{
dis[i]=inf;
vis[i]=false;
}
yf temp;
int x,k,t;
dis[s]=0;//此时不标记s为已找到
temp.dis=0,temp.nu=s;
q.push(temp);
for(int i=1;i<=n;i++)
{
while(q.size()&&vis[q.top().nu]) q.pop();
temp=q.top();q.pop();
x=temp.nu;
vis[x]=true;//出堆时才标记
//if(x==e) return dis[x];
for(t=fi[x];t;t=w[t].la)
{
k=w[t].en;
if(!vis[k]&&(dis[k]>dis[x]+w[t].len))
{
dis[k]=dis[x]+w[t].len;
q.push(yf(dis[k],k));
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,a,b,c;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
scanf("%d%d",&s,&e);
dijkstra(s,e);
printf("%d",dis[e]);
}
结论:某点第一次出堆时,最短路已确定