2017.9.29 road 失败总结
2017-09-29 18:41
162 查看
首先要明确:多源最短路不只有floyd,还有n遍单源最短路
而且有时比floyd快。
所以可以用n遍spfa求所有点的单源最短路
期望复杂度n*(n*2)
然后对于每个单源最短路,求出经过每条边的次数(这里指最短路长度相同,经过点不同的边)
然后从源点往下,求不统计相同最短路情况,走到每一条边的至少经过次数
然后对于每一条边,同长的次数*一次的次数就是它经过的次数、
码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int tot,zhong[500005],v[500005],hou[500005],xia[10005],d[10005],cnt,n,m,a,b,c,i,s;
bool vis[10005];
void jia(int a,int b,int c)
{
++tot,zhong[tot]=b,v[tot]=c,hou[tot]=xia[a],xia[a]=tot;
}
struct dian
{
int id,v;
}dui[100005];
void ins()
{
int o=cnt;
bool f=0;
while(o>1&&!f)
{
if(dui[o/2].v<dui[o].v)
{
swap(dui[o/2],dui[o]);
}else f=1;
o=o/2;
}
}
void del()
{
dui[1]=dui[cnt];
cnt--;
int o=1;
int mb=o;
bool f=0;
while(o<=cnt&&!f)
{
if(o*2<=cnt&&dui[o*2].v<dui[o].v)
mb=o*2;
if(o*2+1<=cnt&&dui[o*2+1].v<dui[o].v&&dui[o*2+1].v<dui[o*2].v)
mb=o*2+1;
if(o==mb)f=1;
else
{
swap(dui[o],dui[mb]);
o=mb;
}
}
}
void dij(int s)
{
dian o;
int i;
d[s]=0;
dui[++cnt].id=s;
dui[cnt].v=0;
while(cnt)
{
o=dui[1];
del();
if(vis[o.id])continue;
vis[o.id]=1;//cout<<cnt<<endl;
cout<<o.id<<endl;
for(i=xia[o.id];i!=-1;i=hou[i])
{
int nd=zhong[i];
if(d[nd]>o.v+v[i])
{
d[nd]=o.v+v[i];
dui[++cnt].id=nd;
dui[cnt].v=d[nd];
ins();
}
}
}
}
int main()
{
memset(xia,-1,sizeof(xia));
scanf("%d%d%d",&n,&m,&s);
for(i=1;i<=n;i++)
d[i]=2147483647;
for(i=1;i<=m;i++)
{scanf("%d%d%d",&a,&b,&c);
jia(a,b,c);
}
dij(s);
for(i=1;i<=n;i++)
printf("%d ",d[i]);
}
而且有时比floyd快。
所以可以用n遍spfa求所有点的单源最短路
期望复杂度n*(n*2)
然后对于每个单源最短路,求出经过每条边的次数(这里指最短路长度相同,经过点不同的边)
然后从源点往下,求不统计相同最短路情况,走到每一条边的至少经过次数
然后对于每一条边,同长的次数*一次的次数就是它经过的次数、
码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int tot,zhong[500005],v[500005],hou[500005],xia[10005],d[10005],cnt,n,m,a,b,c,i,s;
bool vis[10005];
void jia(int a,int b,int c)
{
++tot,zhong[tot]=b,v[tot]=c,hou[tot]=xia[a],xia[a]=tot;
}
struct dian
{
int id,v;
}dui[100005];
void ins()
{
int o=cnt;
bool f=0;
while(o>1&&!f)
{
if(dui[o/2].v<dui[o].v)
{
swap(dui[o/2],dui[o]);
}else f=1;
o=o/2;
}
}
void del()
{
dui[1]=dui[cnt];
cnt--;
int o=1;
int mb=o;
bool f=0;
while(o<=cnt&&!f)
{
if(o*2<=cnt&&dui[o*2].v<dui[o].v)
mb=o*2;
if(o*2+1<=cnt&&dui[o*2+1].v<dui[o].v&&dui[o*2+1].v<dui[o*2].v)
mb=o*2+1;
if(o==mb)f=1;
else
{
swap(dui[o],dui[mb]);
o=mb;
}
}
}
void dij(int s)
{
dian o;
int i;
d[s]=0;
dui[++cnt].id=s;
dui[cnt].v=0;
while(cnt)
{
o=dui[1];
del();
if(vis[o.id])continue;
vis[o.id]=1;//cout<<cnt<<endl;
cout<<o.id<<endl;
for(i=xia[o.id];i!=-1;i=hou[i])
{
int nd=zhong[i];
if(d[nd]>o.v+v[i])
{
d[nd]=o.v+v[i];
dui[++cnt].id=nd;
dui[cnt].v=d[nd];
ins();
}
}
}
}
int main()
{
memset(xia,-1,sizeof(xia));
scanf("%d%d%d",&n,&m,&s);
for(i=1;i<=n;i++)
d[i]=2147483647;
for(i=1;i<=m;i++)
{scanf("%d%d%d",&a,&b,&c);
jia(a,b,c);
}
dij(s);
for(i=1;i<=n;i++)
printf("%d ",d[i]);
}
相关文章推荐
- 2017.9.7 JC loves Mkk 失败总结
- 不允许进行远程连接可能会导致此失败 error: 40 (总结)
- 项目经理第一个多月的失败总结
- 002java面试笔记——【java基础篇】从团800失败面试总结的java面试题
- 2017.10.17 Codechef MARCH14 GERALD07加强版 失败总结
- Spring单例模式的一次失败经历和总结
- 美团面试失败总结
- 从创业失败的阵痛中得到的宝贵经验(风车网的创业失败教训总结)
- 国内某家家教网站站长的创业自述,前人的失败总结
- iphone 游戏开发 失败经验 总结
- 2017.10.22 方格染色 失败总结
- Docker push失败原因总结
- 2017.10.23 硬币购物 失败总结
- Visual studio 2013安装失败总结
- 关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结
- SecureCRT连接VMware失败的总结
- 从银行转账失败到分布式事务:总结与思考
- CocoStudio可滚动层裁剪失败总结
- java:邮件发送失败总结(只是外网服务器有问题)
- sql server复制 合并复制 失败几次总结的经验 有了这些条件几乎都能成功