原题链接:Here!
分析:并没有什么好说的,裸
注意:
1. 关键是 spfa 和 dijkstra 写法很简洁,get from qscqesze
2. G++ 4.4以上支持bits/stdc++.h !
3. 邻接表写法有趣
4. spfa O(me) m为所有顶点进队平均次数
spfa :
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000;
vector<pair<int,int> > G[maxn]; // 构建邻接表
int d[maxn],inq[maxn];
int n,m,s,t;
void init(){
for(int i=0;i<maxn;i++) d[i]=1e9; // 为何用memset()会无法初始化d呢?
for(int i=0;i<maxn;i++) inq[i]=0;
for(int i=0;i<maxn;i++) G[i].clear();
}
void spfa(){
queue<int> q;
q.push(s);
inq[s]=1; d[s]=0;
while(!q.empty()){
int u = q.front();
q.pop(); inq[u]=0;
for(int i=0;i<G[u].size();i++){
int v = G[u][i].first;
if(d[v]>d[u]+G[u][i].second){ // 松弛
d[v]=d[u]+G[u][i].second;
if(inq[v]==1)continue;
inq[v]=1; q.push(v);
}
}
}
}
int main(){
int a,b,x;
while(cin>>n>>m){
init();
for(int i=0;i<m;i++){
cin>>a>>b>>x; // 无向图
G[a].push_back(make_pair(b,x));
G[b].push_back(make_pair(a,x));
}
cin>>s>>t;
spfa();
if(d[t]==1e9) printf("-1\n");
else printf("%d\n",d[t]);
}
return 0;
补充:为什么用memset()初始化d[]为1e6失败?
memset函数对数组而言只能用于置零(0)或置负一(-1)操作。因为memset函数是对单个字节操作如果你把int a[5] 置2;memset(a,2,sizeof(int )*5); 因为它是整数型 数组有四个字节,而每个字节都被赋值为2;即数(例 int a[5])每个元素(如a[0])中的每个字节(整型数组每个元素含有四个字节)的值都被赋予成2,二进制表示及 (00000010 00000010 00000010 00000010);所以输出十进制printf(" %d ",a[0])为33686018;所以不能用memset对数组置0与-1以外的数赋值,因为-1的二进制码为 (1111111111111111 11111111 11111111)置负一数不会改变。
dijkstra:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000;
int n,m,s,t;
int d[maxn];
vector<pair<int,int> > E[maxn]; // 二维动态数组
void init(){
for(int i=0;i<maxn;i++) d[i]=1e9;
for(int i=0;i<maxn;i++) E[i].clear();
}
void dijkstra(){ // 优先队列对spfa优化
// dijkstra 优先队列
d[s]=0;
priority_queue<pair<int,int> > q; // 优先队列默认为大顶堆所以传入负数就从小开始了
q.push(make_pair(-d[s],s)); // 假如不用优先队列每次都得选出到起点最近的点d[],用优先队列可以省去不少东西
while(!q.empty()){
int u=q.top().second; // 只需要考虑点
q.pop();
for(int i=0;i<E[u].size();i++){
int v=E[u][i].first;
if(d[v]>d[u]+E[u][i].second){ // 松弛
d[v]=d[u]+E[u][i].second;
q.push(make_pair(-d[v],v));
}
}
}
}
int main(){
int a,b,x;
while(cin>>n>>m){
init();
for(int i=0;i<m;i++){
cin>>a>>b>>x;
E[a].push_back(make_pair(b,x));
E[b].push_back(make_pair(a,x));
}
cin>>s>>t;
dijkstra();
// for(int i=0;i<m;i++) printf("%d ",d[i]);
if(d[t]==1e9) printf("-1\n");
else printf("%d\n",d[t]);
}
return 0;
}