1003. Emergency (25)
2016-07-20 20:15
375 查看
考查知识点:最短路径
这道题主要是能用代码写出迪杰斯特拉算法来即可秒,暂时看的很懵懂,再碰到题的时候在加深理解吧。
这道题主要是能用代码写出迪杰斯特拉算法来即可秒,暂时看的很懵懂,再碰到题的时候在加深理解吧。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXV = 510; //最大定点数 const int INF = 10000000; //无穷大 //n为顶点数,m为边数,st和ed分别为起点和终点 //G为邻接矩阵,weight为点权,d[]记录最短距离,w[]记录最大点权之和,num[]记录最短路径条数 int n,m,st,ed,G[MAXV][MAXV],weight[MAXV],d[MAXV],w[MAXV],num[MAXV]; bool vis[MAXV]={false}; //vis[i]==true表示定点i已访问,初始化均为false void Dijkstra(int s){ //s为起点 fill(d,d+MAXV,INF); memset(num,0,sizeof(num)); memset(w,0,sizeof(w)); d[s]=0; w[s]=weight[s]; num[s]=1; for(int i=0;i<n;i++){ int u=-1,MIN=INF; for(int j=0;j<n;j++){ if(vis[j]==false&&d[j]<MIN){ u=j; MIN=d[j]; } } //找不到小于INF的d[u],说明剩下的顶点和起点s不连通 if(u==-1)return ; vis[u]=true; //标记u为已访问 for(int v=0;v<n;v++){ //如果v未访问&&u能到达v&&以u为中介点可以使d[v]更优 if(vis[v]==false&&G[u][v]!=INF){ if(d[u]+G[u][v]<d[v]){ d[v]=d[u]+G[u][v]; w[v]=w[u]+weight[v]; num[v]=num[u]; }else if(d[u]+G[u][v]==d[v]){ if(w[u]+weight[v]>w[v]) w[v]=w[u]+weight[v]; num[v]+=num[u]; } } } } } int main(){ scanf("%d%d%d%d",&n,&m,&st,&ed); for(int i=0;i<n;i++) scanf("%d",&weight[i]); int u,v; fill(G[0],G[0]+MAXV*MAXV,INF);//初始化图 for(int i=0;i<m;i++){ scanf("%d%d",&u,&v); scanf("%d",&G[u][v]); //读入边权 G[v][u]=G[u][v]; } Dijkstra(st); printf("%d %d\n",num[ed],w[ed]); return 0; }
相关文章推荐
- [数据库] Oracle使用CASE判断解决多值问题
- 数位DP(组合数打表)—— Round Numbers ( POJ 3252 )
- NYOJ-56
- Codeforces 450B Jzzhu and Sequences
- 几种中文乱码的解决方法
- windows下进程终结taskklill
- Groovy学习
- hdu 1013 Digital Roots
- overload and overwrite in C++
- QT5使用Webkti
- 漫步微积分八——多项式求导
- 基于XSocket框架的socket编程技艺(同步通信)
- uva 11572 唯一的雪花 (滑动窗口)
- Remove Nth Node From End of List leetcode java
- Jenkins入门系列--Jenkins安装与配置
- Qt qml 实现类似手机电话薄联系人首字母查找
- Service的使用(二)启动服务与IntentService
- C#中Main函数为什么要static
- Android--Uri
- 读论文 + 总结 + 笔记