Luogu单源最短路径模版题
dijkstra
#include<cstdio>
#include<vector>
using namespace std;
const int oo=0xfffff;
struct data
{
int to,val;
};
vector<data> edge[10001];
bool visit[10001];
int cost[10001],n,m,s;
void add(int a,int b,int val)
{
data tmp;
tmp.to=b;
tmp.val=val;
edge[a].push_back(tmp);
}
void init()
{
scanf("%d%d%d",&n,&m,&s);
int a,b,val;
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&val);
add(a,b,val);
}
}
void first()
{
for (int i=1;i<=n;i++) cost[i]=oo;
cost[s]=0;
}
void dijkstra()
{
for (int i=1;i<=n;i++)
{
int mincost=oo,mini;
for (int j=1;j<=n;j++)
{
if (!visit[j]&&mincost>cost[j])
{
mincost=cost[j];
mini=j;
}
}
visit[mini]=true;
int len=edge[mini].size();
for (int j=0;j<len;j++)
cost[edge[mini][j].to]=min(cost[edge[mini][j].to],mincost+edge[mini][j].val);
}
}
int main()
{
init();
first();
dijkstra();
for (int i=1;i<=n;i++)
if (cost[i]!=0xfffff) printf("%d ",cost[i]);
else printf("%d ",2147483647);
return 0;
}
bellman_ford
#include<cstdio>
#include<vector>
using namespace std;
const int oo=0xfffff;
struct data
{
int str,to,val;
};
vector<data> e;
bool visit[10001];
int cost[10001],n,m,s;
void add(int a,int b,int val)
{
data tmp;
tmp.str=a;
tmp.to=b;
tmp.val=val;
e.push_back(tmp);
}
void init()
{
scanf("%d%d%d",&n,&m,&s);
int a,b,val;
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&val);
add(a,b,val);
}
}
void first()
{
for (int i=1;i<=n;i++) cost[i]=oo;
cost[s]=0;
}
void bellman_ford()
{
for (int i=1;i<=n;i++)
{
bool flag=false;
for (int j=0;j<m;j++)
{
if (cost[e[j].to]>cost[e[j].str]+e[j].val)
{
flag=true;
cost[e[j].to]=cost[e[j].str]+e[j].val;
}
}
if (!flag) break;
}
}
int main()
{
init();
first();
bellman_ford();
for (int i=1;i<=n;i++)
if (cost[i]!=0xfffff) printf("%d ",cost[i]);
else printf("%d ",2147483647);
return 0;
}
SPFA
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
struct data
{
int e,v;
};
vector<data> a[500001];
int n,m,f,g,s,w,que[10001],cost[10001];
bool visit[10001];
void add(int sta,int end,int val)
{
data temp;
temp.e=end;temp.v=val;
a[sta].push_back(temp);
}
void SPFA()
{
int head=0,tail=1,mod=n+1;
que[head]=s;
while (head!=tail)
{
int t=que[head];
for (int i=0;i<a[t].size();i++)
{
if (cost[t]+a[t][i].v<cost[a[t][i].e])
{
if (!visit[a[t][i].e])
{
que[tail]=a[t][i].e;
tail++;
tail%=mod;
visit[a[t][i].e]=true;
}
cost[a[t][i].e]=cost[t]+a[t][i].v;
}
}
head++;
head%=mod;
visit[t]=0;
}
}
void First()
{
for (int i=1;i<=n;i++) cost[i]=2147483647;
cost[s]=0;
}
int main()
{
cin>>n>>m>>s;
for (int i=1;i<=m;i++)
{
cin>>f>>g>>w;
add(f,g,w);
}
First();
SPFA();
for (int i=1;i<=n;i++) cout<<cost[i]<<" ";
return 0;
}