HDU 2544 最短路(dijkstra)
2015-08-19 19:53
375 查看
题目大意:
中文题。
解题思路:
这个数据量似乎floyd都能过……我写了个用set优化的dijkstra。
中文题。
解题思路:
这个数据量似乎floyd都能过……我写了个用set优化的dijkstra。
#include<cstdio> #include<cstring> #include<string> #include<cmath> #include<iostream> #include<set> #define LL long long #define db double #define maxn 10000000 #define EPS 1e-15 #define max(a,b) ((a>b)?(a):(b)) #define min(a,b) ((a<b)?(a):(b)) using namespace std; int m,q,i,n,j; int g[1086][1086],dis[1086]; bool vis[1086]; struct cmp{ bool operator()(const int & a,const int & b){ return dis[a]<dis[b] || dis[a]==dis[b] && a<b; } }; set<int ,cmp> S; int dij(int s,int t){ memset(vis,0,sizeof(vis)); memset(dis,0x7f,sizeof(dis)); S.clear(); S.insert(s); dis[s]=0; while (!S.empty()){ i=*S.begin(); S.erase(i); if (i==t) return dis[t]; vis[i]=true; for(j=1;j<=n;++j){ if(!vis[j] && g[i][j]){ if (dis[j]>dis[i]+g[i][j]){ S.erase(j); dis[j]=dis[i]+g[i][j]; S.insert(j); } } } } return -1; } int main(){ while(1){ int a,b,c; memset(g,0x1f,sizeof(g)); scanf("%d%d",&n,&m); if (n==0 && m==0) break; for (int i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); g[a][b]=c; g[b][a]=c; } printf("%d\n",dij(1,n)); } return 0; }
相关文章推荐
- 题目:颠倒整数
- JDBC简介(2)
- mvn test 整工程测试解决方案(基于junit.framework)
- Java内存区域划分、内存分配原理
- [Java] switch-case 当中的变量定义
- VC++深入详解——16章:线程同步,事件对象
- UIScrollView
- Eclipse下用Maven搭建SpringMvc+MyBatis
- 设置字体、字号等格式属性
- HDU 2006
- 题目:链表插入排序
- 最近点对问题
- 告诉一个远程团队协作的故事
- ioc开发学习 --简易计时器 (基于iPhone5屏幕尺寸开发)
- FTP上传网站操作过程,自己看
- memcached--高速存储服务
- 题目:链表划分
- 题目:链表倒数第n个节点
- PAT-PAT (Advanced Level) Practise 1006. Sign In and Sign Out (25) (简单题)【一星级】
- 当你访问淘宝的时候,发生了什么?