想看更多模板,请点击:http://blog.csdn.net/martinue/article/category/6268283
floyd判断最小环:
spfa:
floyd:
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
tu[i][j]=min(tu[i][j],tu[i][k]+tu[k][j]);
floyd判断最小环:
int min0=maxn;
for(int k=1;k<=n;k++)
{
for(int i=1;i<k;i++)
for(int j=i+1;j<k;j++)
min0=min(min0,d[i][j]+a[i][k]+a[k][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=min(d[i][k]+d[k][j],d[i][j]);
}
spfa:
const int INF=100000000,N=1600000;///N表示点的最多数量
int head[N],dis[N];
bool vis[N];
int ip;
struct data
{
int to,next,w;
}tu[N*N];
void init()
{
ip=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v,int w)
{
tu[ip].to=v,tu[ip].w=w,tu[ip].next=head[u],head[u]=ip++;
}
void spfa(int s,int n)
{
queue<int>q;
for (int i=0; i<=n; i++)
dis[i]=INF;
memset(vis,0,sizeof(vis));
q.push(s);
dis[s]=0;
while(!q.empty())
{
int h=q.front();
q.pop();
vis[h]=0;
for (int i=head[h]; i!=-1; i=tu[i].next)
{
int v=tu[i].to;
int w=tu[i].w;
if (dis[v]>dis[h]+w)
{
dis[v]=dis[h]+w;
if (!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
}