hdu5876 Sparse Graph
2016-09-12 20:12
351 查看
题意:给2e6的点,2e5的边,求补图中,单源点到所有点的最短路
题解:比赛时候,没有仔细考虑这个,发现其实挺水的
边少的,一半是用bfs
维护两个set,set1中,记录的是,没有处理的点,set2中是刚刚处理的点
经过一个点时,把连接的点,且在set1中的点,放到set2中,然后set1中的点就可以处理,交换set1和set2
时间复杂度O(m+n)(比赛时候错误的估计了复杂度。。)
题解:比赛时候,没有仔细考虑这个,发现其实挺水的
边少的,一半是用bfs
维护两个set,set1中,记录的是,没有处理的点,set2中是刚刚处理的点
经过一个点时,把连接的点,且在set1中的点,放到set2中,然后set1中的点就可以处理,交换set1和set2
时间复杂度O(m+n)(比赛时候错误的估计了复杂度。。)
queue <int> q; set <int> s; set <int> s1; int ans[200010]; set <int> ss[200010]; int main(){ int t; cin>>t; while(t--){ while(!q.empty()) q.pop(); s.clear(); for(int i=0;i<200002;i++) ss[i].clear(); int n,m; scanf("%d %d",&n,&m); int x,y; for(int i=0;i<m;i++){ scanf("%d %d",&x,&y); ss[x].insert(y); ss[y].insert(x); } int beg=0; cin>>beg; for(int i=1;i<=n;i++){ if(i!=beg){ s.insert(i); } } memset(ans,-1,sizeof(ans)); ans[beg]=0; q.push(beg); while(!q.empty()){ int xx=q.front(); q.pop(); for(set <int>::iterator it=ss[xx].begin();it!=ss[xx].end();it++){ if(s.count(*it)!=0){ s.erase(*it); s1.insert(*it); } } for(set <int>::iterator it=s.begin();it!=s.end();it++){ ans[*it]=ans[xx]+1; q.push(*it); } s.swap(s1); s1.clear(); } bool bool1=true; for(int i=1;i<=n;i++){ if(i!=beg){ if(bool1){ bool1=false; printf("%d",ans[i]); } else { printf(" %d",ans[i]); } } } cout<<endl; } return 0; }
相关文章推荐
- HDU 5877 Weak Pair 树状数组 + DFS
- 用amcharts动态生成饼图
- java客户端调用restful接口
- PAT (Advanced Level) Practise 1116 Come on! Let's C (20)
- ADL:社交网络分析与数据挖掘(DAY3)
- JZOJ 4772. 运输妹子
- 【NOIP2016提高A组模拟9.9】总结
- hihocoder 1252 2015北京赛区区域赛D
- java util :获取国家省份城市工具类
- 用for循环实现的菱形图案
- java之hashMap和hashTable的区别
- 对动态数组的操作与算法
- CSS选择器修改样式,及单独修改样式this.style.
- SQL language
- WEB前端 | HTML基础——(4)定位position
- CentOS 7.2下 RabbitMQ 安装记录
- JS函数参数都是按值传递的!
- Android Application类
- 时间复杂度和空间复杂度详解
- 2016.09.10 初中部 NOIP普及组 模拟赛