floyd【模板】
floyd求最短路
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,s1,s2,dis[101][101];
inline void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][j]>dis[i][k]+dis[k][j])
{
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
dis[x][y]=z;
}
scanf("%d%d",&s1,&s2);
dis[s1][s1]=0;
floyd();
printf("%d",dis[s1][s2]);
return 0;
}
floyd判断两点是否联通:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
using namespace std;
int n,m,ans;
bool dis[110][110];
inline void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][k]==1&&dis[k][j]==1)
dis[i][j]=1;
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
dis[a][b]=1;
}
for(int i=1;i<=n;i++) dis[i][i]=1;
floyd();
//dis【i】【j】==1表示此点联通
return 0;
}