http://acm.hdu.edu.cn/showproblem.php?pid=1874
首先是朴素版本 dij板子 复杂度 o(n)2;
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000000;
int n,m;
int e[2000][2000];
int dis[2000];
int vis[2000];
void dij(int s){
for(int i=0;i<n;i++){
dis[i]=e[s][i];
vis[i]=0;
}
vis[s]=1;
for(int i=0;i<n-1;i++){
int minn=inf;
int u;
for(int j=0;j<n;j++){
if(vis[j]==0&&dis[j]<minn){
minn=dis[j];
u=j;
}
}
vis[u]=1;
for(int v=0;v<n;v++){
if(e[u][v]<inf){
if(!vis[v]&&dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
return ;
}
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j) e[i][j]=0;
else e[i][j]=inf;
}
}
while(m--){
int x,y,z;
cin>>x>>y>>z;
if(z<e[x][y]){
e[x][y]=z;
e[y][x]=z;
}
}
int s,t;
cin>>s>>t;
dij(s);
if(dis[t]==inf){
cout<<"-1"<<endl;
}
else{
cout<<dis[t]<<endl;
}
}
return 0;
}
接着 堆优化 主要是学习写法 复杂的nlogn
前置技能 STL:
typedef pair<int,int> p;
vector<p > v[maxn];//边集 专门存一点到所有点的边长
make_pair(int,int)//相当于构造一个 pair对象
priority_queue<p,vector<p>,greater<p> > q;//堆的升序写法
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000000;
typedef pair<int,int> p;
vector<p > v[maxn];//边集
int dis[maxn];
int n,m;
void dij(int s){
for(int i=0;i<n;i++){
dis[i]=inf;
}
priority_queue<p,vector<p>,greater<p> > q;//升序
dis[s]=0;
q.push(make_pair(dis[s],s));//边长 与 点
while(!q.empty()){
int now=q.top().second;//取出与离源点最近的点
q.pop();
for(int i=0;i<v[now].size();i++){//该点的所有邻接点
int vv=v[now][i].first;//邻接点
if(dis[vv]>dis[now]+v[now][i].second){
dis[vv]=dis[now]+v[now][i].second;
q.push(make_pair(dis[vv],vv));
}
}
}
}
int main(){
while(cin>>n>>m){
for(int i=0;i<n;i++){//初始化
v[i].clear();
}
while(m--){
int x,y,z;
cin>>x>>y>>z;//加边 点 与 边
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,z));
}
int s,t;
cin>>s>>t;
dij(s);
if(dis[t]==inf) cout<<"-1"<<endl;
else cout<<dis[t]<<endl;
}
}