NYOJ 115 Dijstra入门
来源:互联网 发布:java框架 编辑:程序博客网 时间:2024/05/17 02:20
传送门
思路:
暴乱城市为起点,求出到每个点的距离的最短路,在部队所在的点里找最小值。
#include<cstring>#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<vector>using namespace std;#define LL long long#define INF 0x3f3f3f3fconst int MAXN=1005;int n,m,p,q,T;int mp[MAXN][MAXN],d[MAXN];int des[MAXN];bool vis[MAXN];void Dijstra(int q){ memset(vis,0,sizeof(vis)); for(int i=1;i<=m;i++)d[i]=(i==q?0:INF); while(1){ int v=-1; for(int i=1;i<=m;i++){ if(!vis[i]&&(v==-1||d[i]<d[v]))v=i; } if(v==-1)break; vis[v]=1; for(int i=1;i<=m;i++)d[i]=min(d[i],d[v]+mp[v][i]); }}void init(){ for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) mp[i][j]=(i==j?0:INF);}int a,b,l;int main(){ scanf("%d",&T); while(T--){ scanf("%d%d%d%d",&n,&m,&p,&q); for(int i=1;i<=n;i++){ scanf("%d",des+i); } init(); while(p--){ scanf("%d%d%d",&a,&b,&l); if(mp[a][b]) mp[a][b]=mp[b][a]=min(mp[a][b],l); else mp[a][b]=mp[b][a]=l; } int ans=INF; Dijstra(q); for(int i=1;i<=n;i++){ ans=min(ans,d[des[i]]); } cout<<ans<<endl; } return 0;}
再来个基于优先队列的dijstra。快不少
#include <iostream>#include<cstring>#include<cstdio>#include<vector>#include<queue>using namespace std;#define INF 0x3f3f3f3fconst int MAX=1005;typedef pair<int,int> pii;priority_queue< pii , vector<pii> , greater<pii> > Q; //优先队列int edges[MAX][MAX]; //邻接表int T,m,n,p,q;int des[MAX];int d[MAX]; //最短路径路径长度void init(){ for(int i =1; i<=n; ++i) { for(int j =1; j<=n; ++j) { if(i == j) edges[i][j] = 0; else edges[i][j] = INF; } }}void dijkstra(int v){ bool vis[MAX]; for(int i = 1; i <=n; ++i) { d[i]=(i==v?0:INF); } memset(vis,0,sizeof(vis)); Q.push(make_pair(d[v],v)); //v 起点 while(!Q.empty()) { pii u = Q.top(); Q.pop(); int x = u.second; if(vis[x]) continue; vis[x] = true; for(int j = 1; j <= n; ++j) { if(!vis[j] && edges[x][j] < INF && d[x] + edges[x][j] < d[j]) { d[j] = d[x] + edges[x][j]; Q.push( make_pair(d[j],j) ); } } }}int main(){ int a,b,l; scanf("%d",&T); while(T--){ scanf("%d%d%d%d",&m,&n,&p,&q); init(); for(int i=1;i<=m;i++)scanf("%d",des+i); while(p--){ scanf("%d%d%d",&a,&b,&l); if(edges[a][b])edges[a][b]=edges[b][a]=min(edges[a][b],l); else edges[a][b]=edges[b][a]=l; } dijkstra(q); int ans=INF; for(int i=1;i<=m;i++)ans=min(ans,d[des[i]]); printf("%d\n",ans); } return 0;}
1 0
- NYOJ 115 Dijstra入门
- Dijstra
- dijstra
- Dijstra
- POJ2387 最短路入门题 [spfa,dijstra+heap]
- NYOJ 115 城市平乱(Dijkstra入门)
- nyoj分类-语言入门
- NYOJ语法入门汇总
- nyoj 扩展欧几里德入门
- nyoj 入门总结
- NYOJ-115城市平乱(图论入门题)
- Dijstra算法
- Dijstra算法
- dijstra算法
- dijstra算法
- hiho dijstra
- Dijstra算法
- 图---Dijstra
- 我是猪,不关机
- 【职坐标】java面向对象前言——static关键字
- CocosCreator中使玩家移动到点击位置
- javascript快速入门
- baidu地图sdk使用(3)自定义定位图标
- NYOJ 115 Dijstra入门
- android将图片转换为圆形图片
- 知识点:Java变量和数组的默认值
- Hibernate学习笔记----session核心方法
- 多平台消息推送是安卓耗电原因之一?
- 人物遮挡处理
- 46. magento cron
- MyEclipse快捷键大全
- cqu 24915 这是一个标题(线段树区间合并)