城市间紧急救援-多维最短路
2016-12-08 19:58
281 查看
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> #define INF 0x3f3f3f3f using namespace std; const int N=505; int n,m,s,d; int ren ; int ma ; int cnt ; int vis ; int pre ,dis ,nn ; void dij() { for(int i=0;i<n;i++) { dis[i]=ma[s][i]; vis[i]=0; pre[i]=-1; if(dis[i]!=INF) cnt[i]=1,nn[i]=ren[i]; else cnt[i]=0,nn[i]=0; } dis[s]=0; vis[s]=1; nn[s]=ren[s]; for(int i=0;i<n;i++) { int mitt=INF; int k=-1; for(int j=0;j<n;j++) { if(!vis[j]&&dis[j]<mitt) { mitt=dis[k=j]; } } if(k==-1||k==d) return; vis[k]=1; for(int j=0;j<n;j++) { if(!vis[j]&&dis[j]>dis[k]+ma[k][j]) { dis[j]=dis[k]+ma[k][j]; nn[j]=nn[k]+ren[j]; pre[j]=k; cnt[j]=cnt[k]; } else if(!vis[j]&&dis[j]==dis[k]+ma[k][j]) { cnt[j]+=cnt[k]; if(nn[j]<nn[k]+ren[j]) nn[j]=nn[k]+ren[j],pre[j]=k; } } } } int main() { int ans[505]; scanf("%d%d%d%d",&n,&m,&s,&d); for(int i=0;i<n;i++) { scanf("%d",&ren[i]); vis[i]=0; } for(int i=0;i<n;i++) for(int j=0;j<n;j++) ma[i][j]=INF; for(int i=0;i<m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(ma[a][b]>c) ma[a][b]=ma[b][a]=c; } vis[s]=1; dij(); printf("%d %d\n",cnt[d],nn[d]+ren[s]); ans[0]=d; int flag=1; for(int i=pre[d];i!=-1;i=pre[i]) ans[flag++]=i; printf("%d",s); for(int i=flag-1;i>=0;i--) printf(" %d",ans[i]); printf("\n"); }
相关文章推荐
- 统计字符串种类个数
- docker gitlab邮件配置
- DIV设置浮动float以后下一个DIV要换行的方法
- Qt操作windows注册表例程
- OSG 场景节点添加,删除,隐藏 ,开关
- 公路村村通 -并查集
- CentOS 6.8 使用start-stop-daemon命令
- 结对测试工具PICT用户手册(2)——运行PICT
- 中文语料上的word2vec训练
- SSM项目的配置文件整合
- Oracle中把一个DateTime的字符串转化成date类型。to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'),
- 为什么说invalidate()不能直接在线程中调用
- sublime Text 3 安装插件
- 欢迎使用CSDN-markdown编辑器
- LayoutInflater 实例的三种用法
- serpent语言的第一个智能合约
- 算法训练 未名湖边的烦恼
- 二维码集成
- 实验11——指针的基础应用
- 如何衡量存储系统的可靠性