学习了一下SPFA和前向星
SPFA 复杂度为O(k*e) (k为所有顶点进队的平均次数且k<=2) ,可处理负权边,判负环
前向星是一种静态邻接表,写起来很方便
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
struct Edge{
int to,next,w;
}edge[10005*2];
int head[105*2];
bool vis[105];
int d[105];
int c[105];
void addedge(int u, int v, int w){
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt++;
}
int spfa(int s){
queue<int>q;
memset(vis,0,sizeof(vis));
memset(d,0x3f,sizeof(d));
memset(c,0,sizeof(c));
q.push(s); vis[s] = 1; d[s] = 0; c[s] = 1;
while(!q.empty()){
int k = q.front(); q.pop(); vis[k] = 0;
for(int i = head[k]; ~i; i = edge[i].next){
int v = edge[i].to, w = edge[i].w;
if(d[v] > d[k] + w){
d[v] = d[k] + w;
if(!vis[v]) {
vis[v] = 1;
q.push(v);
c[v]++;
if(c[v] > n) return 0;
}
}
}
}
return 1;
}
void init(){
for(int i = 0; i < 105; ++i){
edge[i].next = -1;
}
memset(head,-1,sizeof(head));
cnt = 0;
}
int main(){
while(~scanf("%d%d",&n,&m) && (n||m)){
init();
int u,v,w;
for(int i = 0; i < m; ++i){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
spfa(1);
printf("%d\n",d[n]);
}
return 0;
}