题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790

题目大意:题意明了,输出最短路径及其花费。

需要注意的几点:(1)当最短路径相同时,输出最小花费!!!

(2)更新路径的时候要注意更新花费。

 #include <iostream>
#include <cstdio>
using namespace std;
const int INF=;
int map[][],Min,n,cost[][],node[],vis[];
int pr[]; void set()
{
for (int i=; i<=n; i++)
{
vis[i]=;
node[i]=INF;
pr[i]=INF;
for (int j=; j<=n; j++)
{
map[i][j]=INF;
cost[i][j]=INF;
}
}
} void dijkstra(int m)
{
int tm=m;
vis[m]=;
node[m]=;
pr[m]=;
for (int k=; k<=n; k++)
{
Min=INF;
int M=INF;
for (int i=; i<=n; i++)
if(!vis[i])
{
if (node[i]>map[tm][i]+node[tm])
{
node[i]=map[tm][i]+node[tm];
pr[i]=cost[tm][i]+pr[tm];
}
else if(node[i]==map[tm][i]+node[tm])
{
if(pr[i]>cost[tm][i]+pr[tm])
{
node[i]=map[tm][i]+node[tm];
pr[i]=cost[tm][i]+pr[tm];
}
}
if (Min>node[i])
{
M=pr[i];
Min=node[i];
m=i;
}
else if (Min==node[i])
{
if(M>pr[i])
{
M=pr[i];
Min=node[i];
m=i;
}
}
}
vis[m]=;
tm=m;
}
} int main ()
{
int a,b,d,p,m;
while(scanf("%d%d",&n,&m),n||m)
{
set();
while (m--)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if (map[a][b]>d)
{
cost[a][b]=cost[b][a]=p;
map[a][b]=map[b][a]=d;
}
else if (map[a][b]==d)
{
if (cost[a][b]>p)
cost[a][b]=cost[b][a]=p;
}
}
scanf("%d%d",&a,&b);
dijkstra(a);
printf ("%d %d\n",node[b],pr[b]);
}
}

一种简单明了的代码。

 #include <iostream>
#include <cstdio> using namespace std; const int INF=; int Map[][],Min,Mmin,n,cost[][],node[],vis[];
int pr[],tm; void sett()
{
for (int i=; i<=n; i++)
{
node[i]=INF;
vis[i]=;
pr[i]=INF;
for (int j=; j<=n; j++)
{
Map[i][j]=INF;
cost[i][j]=INF;
}
}
} int dijkstra()
{
for (int i=; i<=n; i++)
{
Min=INF;
Mmin=INF;
for (int j=; j<=n; j++)
{
if (!vis[j])
{
if (Min>node[j])
{
Min=node[j];
Mmin=pr[j];
tm=j;
}
else if (Min==node[j])
{
if (Mmin>pr[j])
{
Mmin=pr[j];
tm=j;
}
}
}
}
vis[tm]=;
for (int j=; j<=n; j++)
if (!vis[j])
{
if (node[j]>Map[tm][j]+node[tm])
{
node[j]=Map[tm][j]+node[tm];
pr[j]=cost[tm][j]+pr[tm];
}
else if (node[j]==Map[tm][j]+node[tm])
{
if (pr[j]>cost[tm][j]+pr[tm])
{
node[j]=Map[tm][j]+node[tm];
pr[j]=cost[tm][j]+pr[tm];
}
}
}
}
} int main ()
{
int m,a,b,d,p,s,t;
while (~scanf("%d%d",&n,&m))
{
if (n==&&m==)
break;
sett();
for (int i=; i<=m; i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if (Map[a][b]>d)
{
Map[a][b]=Map[b][a]=d;
cost[a][b]=cost[b][a]=p;
}
else if (Map[a][b]==d)
{
if (cost[a][b]>p)
cost[a][b]=cost[b][a]=p;
}
}
scanf("%d%d",&s,&t);
node[s]=;
pr[s]=;
dijkstra();
printf ("%d %d\n",node[t],pr[t]);
}
}

最新文章

  1. Angular 2 + Electron 开发web和桌面应用
  2. 各种排序学习归纳总结(Java)
  3. PHP导出Excel一个方法轻松搞定
  4. pyqt5界面与逻辑分离--信号槽的装饰器实现方式
  5. Intel XDK问题
  6. hibernate数据库配置
  7. hdu 1018 Big Number (数学题)
  8. libev事件库学习笔记
  9. display:block;inline;inline-block大总结
  10. javaWeb学习总结(1)- Tomcat服务器学习和使用(3)
  11. Gradle学习之闭包
  12. ActiveMQ的Destination高级特性
  13. 【EMV L2】2CS.001.00 ~ 2CS.007.00
  14. leetcode — anagrams
  15. 常见的SQLALCHEMY列类型
  16. CodeForces - 780C Andryusha and Colored Balloons(dfs染色)
  17. js基础学习笔记(二)
  18. c# RSA 加密解密 java.net公钥私钥转换 要解密的模块大于128字节
  19. js如何获取asp.net服务器端控件的值(label,textbox,dropdownlist,radiobuttonlist等)
  20. SeaJS 与 RequireJS 的差异对比

热门文章

  1. 关闭win7/Server 2008非正常关机启动自动修复功能
  2. chrome扩展程序中以编程方式插入内容脚本不生效的问题
  3. [计算机网络-应用层] DNS:因特网的目录服务
  4. [luogu5176] 公约数
  5. 用Matlab对数据进行线性拟合算法
  6. NOIP 2018 -The Wound-
  7. spring+springMVC+mybatis较全
  8. POJ3347:Kadj Squares——题解
  9. LOJ2351:[JOI2017/2018决赛]毒蛇越狱——题解
  10. BZOJ2668 [cqoi2012]交换棋子 【费用流】