P3371
单源最短路径
#include<iostream>
using namespace std;
const long long int inf=0x7fffffff;
const int M=5000001,N=10002;
long long int e[M],w[M],ne[M],h[N],n,m,s,a,b,c,vis[N],dis[M],idex=1,minn;
void add(int a,int b,int c)
{
e[idex]=b;
w[idex]=c;
ne[idex]=h[a];
h[a]=idex++;
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
cin>>a>>b>>c;
add(a,b,c);
}
for(int i=1;i<=n;i++)
{
vis[i]=0;
dis[i]=inf;
}
dis[s]=0;
int now=s;
while(vis[now]==0)
{
minn =inf;
vis[now]=1;
for(int i=h[now];i!=0;i=ne[i] )
{
int j=e[i];
if(!vis[j]&&dis[j]>dis[now]+w[i])
{
dis[j]=dis[now]+w[i];
}
}
for(int i=1;i<=n;i++)
{
if(!vis[i]&&dis[i]<minn)
{
minn=dis[i];
now=i;
}
}
}
for(int i=1;i<=n;i++)
{
cout<<dis[i]<<' ';
}
}
dijkstra
P4779
#include<bits/stdc++.h>
#define M(x,y) make_pair(x,y)
using namespace std;
int fr[100010],to[200010],nex[200010],v[200010],tl,d[100010];
bool b[100010];
void add(int x,int y,int w){
to[++tl]=y;
v[tl]=w;
nex[tl]=fr[x];
fr[x]=tl;
}
priority_queue< pair<int,int> > q;
int main(){
int n,m,x,y,z,s;
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
for(int i=1;i<=n;i++) d[i]=1e10;
d[s]=0;
q.push(M(0,s));
while(!q.empty()){
int x=q.top().second;
q.pop();
if(b[x]) continue;
b[x]=1;
for(int i=fr[x];i;i=nex[i]){
int y=to[i],l=v[i];
if(d[y]>d[x]+l){
d[y]=d[x]+l;
q.push(M(d[y],y));//懒得重载运算符
}
}
}
for(int i=1;i<=n;i++) printf("%d ",d[i]);
return 0;
}
sfpn
P1629
#include<iostream>
#include<cstring>
using namespace std;
int m[1001][1001];
long long int sum;
int q,n,a,b,c;
int main()
{
memset(m,0x3f,sizeof(m));///必须这样赋初始值,不可以直接={}
cin>>q>>n;
for(int i=1;i<=n;i++)
{
int a,b,c;
cin>>a>>b>>c;
m[a][b]=min(m[a][b],c);
}
for(int i=1;i<=q;i++)
{
for(int j=1;j<=q;j++)
{
for(int k=1;k<=q;k++)
{
if(m[j][k]>m[j][i]+m[i][k])
m[j][k]=m[j][i]+m[i][k];
}
}
}
for(int i=2;i<=q;i++)
{
sum+=(m[1][i]+m[i][1]);
}
cout<<sum;
return 0;
}
两次floyed
P1144
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const long long int mod=100003,N=1000002,M=5000002;
queue<int>q;
int e[M],w[M],ne[M],h[N],dis[N],ans[N],m,n,a,b,c,idex=1;
bool st[N];
void add(int a,int b)
{
e[idex]=b;
ne[idex]=h[a];
h[a]=idex++;
}
void spfa()
{
memset(dis,0x3f,sizeof(dis));
dis[1]=0;
st[1]=1;
q.push(1);
while(!q.empty())
{
int t=q.front();
q.pop();
st[t]=false;
for(int i=h[t];i;i=ne[i])
{
int j=e[i];
if(dis[j]>dis[t]+1)
{
dis[j]=dis[t]+1;
ans[j]=ans[t];
ans[j]%=mod;
if(!st[j])
{
st[j]=true;
q.push(j);
}
}
else if(dis[j]==dis[t]+1)
{
ans[j]+=ans[t];
ans[j]%=mod;
}
}
}
}
int main()
{
ans[1]=1;
memset(st,0,sizeof(st));
cin>>m>>n;
for(int i=1;i<=n;i++)
{
cin>>a>>b;
add(a,b);
add(b,a);
}
spfa();
cout<<1<<endl;
for(int i=2;i<=m;i++)
{
cout<<ans[i]<<endl;
}
}
每一步的可能性都是继承上一步
就是说放松过后变长了,那么这个点的就和上面的一样,如果放松之后不变,那么就上一步+1