SPFA(SLF+LLL)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
const int N = 1e6+10,INF=0x3f3f3f3f;
int head[N],n,m,dis[N],cnt,ans[N],vis[N];
long long sum;
struct node{
int to,Next,w;
}ed[N];
void init(){
memset(head,-1,sizeof head);
memset(dis,INF,sizeof dis);
memset(ans,0,sizeof ans);
memset(vis,0,sizeof vis);
cnt=0;
}
void add(int u,int v,int w){
ed[cnt].to=v;
ed[cnt].Next=head[u];
ed[cnt].w=w;
head[u]=cnt++;
}
bool SPFA(){
deque<int> q;
q.push_back(1),dis[1]=0,vis[1]=1;
sum=dis[1],cnt=1;
while(q.size()){
int u=q.front();
if(dis[u]*cnt>sum){
q.pop_front();
q.push_back(u);
u=q.front();
}
q.pop_front();
sum-=dis[u];cnt--;
vis[u]=0;
for(int i =head[u];~i;i=ed[i].Next){
int t=ed[i].to;
if(dis[t]>dis[u]+ed[i].w){
dis[t]=dis[u]+ed[i].w;
if(!vis[t]){
if(q.empty()||dis[t]>dis[q.front()]){
q.push_back(t);
}
else q.push_front(t);
cnt++;
sum+=dis[t];
if(++ans[t]>n) return false;
vis[t]=1;
}
}
}
}
return true;
}
int main()
{
while(scanf("%d %d",&m,&n)!=EOF){
init();
for(int i = 0 ; i < m ;i++){
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
bool f=SPFA();
if(f) printf("%d\n",dis[n]);
else printf("NO\n");
}
return 0;
}
dijkstra(朴素)
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
const int INF=0x3f3f3f3f;
int e[1100][1100],n,m,dis[1100];
bool vis[1100];
void init(){
memset(dis,0,sizeof dis);
memset(vis,0,sizeof vis);
memset(e,0,sizeof e);/更改/
}
void get_st(){
for(int i = 0 ; i < m ; i++){
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
e[u][v]=e[v][u]=max(e[u][v],w);
}
}
void dijkstra(){
for(int i = 1;i<=n;i++){
dis[i]=e[1][i];
}
vis[1]=1;
for(int t = 1 ; t <= n ; t++){
int k=-1;
for(int i = 1 ; i <= n ; i++){
if(!vis[i]&&(k==-1||dis[i]>dis[k])){/更改/
k=i;
}
}
vis[k]=1;
for(int i = 1; i <= n ; i++){
if(!vis[i]&&dis[i]<min(dis[k],e[k][i])){/更改/
dis[i]=min(dis[k],e[k][i]);
}
}
}
}
int main()
{
int cases;
while(scanf("%d",&cases)!=EOF){
int cnt=1;
while(cases--){
scanf("%d %d",&n,&m);
init();
get_st();
dijkstra();
printf("Scenario #%d:\n",cnt++);
printf("%d\n\n",dis[n]);
}
}
return 0;
}
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <vector>
using namespace std;
typedef pair<int,int>PII;
const int N = 1e6+10,INF=0x3f3f3f3f;
struct node{
int to,Next,w;
}ed[N];
int n,m,dis[N],head[N],cnt,S,E;
bool vis[N];
void init(){
memset(vis,false,sizeof vis);
memset(head,-1,sizeof head);
memset(dis,INF,sizeof dis);
}
void add(int u,int v, int w){
ed[cnt].to=v;
ed[cnt].w=w;
ed[cnt].Next=head[u];
head[u]=cnt++;
}
void dijkstra(){
priority_queue<PII,vector<PII>,greater<PII> >q;
dis[S]=0;
q.push(make_pair(0,S));
while(q.size()){
PII tem=q.top();
int u=tem.second;
q.pop();
if(dis[u]<tem.first) continue;
for(int i = head[u];i!=-1;i=ed[i].Next){
int t=ed[i].to,w=ed[i].w;
if(dis[t]>dis[u]+w){
dis[t]=dis[u]+w;
q.push(make_pair(dis[t],t));
}
}
}
}
int main()
{
while(scanf("%d %d",&m,&n)!=EOF){
cnt=0;
init();
while(m--){
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
S=1,E=n;
dijkstra();
printf("%d\n",dis[E]);
}
return 0;
}