2016大连网络赛Sparse Graph
2016-09-11 21:55
525 查看
唉,比赛时首先想到了bfs,没想太多直接交一发超时,然后开始用set建领结表,set维护未被访问的点优化,结果无限mlt,挂了5小时机,最后还是由队友打掉了这题。。。
其实,这题很好想,逆着想想,就是补图的bfs题,赛后才发现自己为何mlt,手贱加了个vis数组标记访问(其实不需要,set已维护了未访问点,自己还加了个set<int>pos中间值,并不知道自己当时在干嘛- -)真是手贱啊!!!!
今天看了一波题解,思想一致,一看代码,卧槽!!!这特么跟我的太像了!!!(只怪自己太菜。。。
给出之后的ac代码
可能有人会问,为何还加个c集合,直接循环里删a集合中的点不就可以了。这是因为it迭代器在不断的往后移位,而如果你在循环中a.erase()某个值,则it位置会不知何处,编译器会报错!(这确实是看了网上某苣代码 学到的新东西- -)
唉 ,,总结还是自己太菜。。
其实,这题很好想,逆着想想,就是补图的bfs题,赛后才发现自己为何mlt,手贱加了个vis数组标记访问(其实不需要,set已维护了未访问点,自己还加了个set<int>pos中间值,并不知道自己当时在干嘛- -)真是手贱啊!!!!
今天看了一波题解,思想一致,一看代码,卧槽!!!这特么跟我的太像了!!!(只怪自己太菜。。。
给出之后的ac代码
#include<cstdio> #include<cstdlib> #include<iostream> #include<stack> #include<queue> #include<algorithm> #include<string> #include<cstring> #include<cmath> #include<vector> #include<map> #include<set> #define mem(a,b) memset(a,b,sizeof(a)) #define memmax(a) memset(a,0x3f,sizeof(a)) #define pfn printf("\n") #define ll __int64 #define mod 1000000007 #define sf(a) scanf("%d",&a) #define sf64(a) scanf("%I64d",&a) #define sf264(a,b) scanf("%I64d%I64d",&a,&b) #define sf364(a,b,c) scanf("%I64d%I64d%I64d",&a,&b,&c) #define sf2(a,b) scanf("%d%d",&a,&b) #define sf3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define sf4(a,b,c,d) scanf("%d%d%d%d",&a,&b,&c,&d) #define sff(a) scanf("%f",&a) #define sfs(a) scanf("%s",a) #define sfs2(a,b) scanf("%s%s",a,b) #define sfs3(a,b,c) scanf("%s%s%s",a,b,c) #define sfc(a) scanf("%c",&a) #define debug printf("***\n") const double PI = acos(-1.0); const double e = exp(1.0); const int INF = 0x7fffffff;; template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; } template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; } template<class T> inline T Min(T a, T b) { return a < b ? a : b; } template<class T> inline T Max(T a, T b) { return a > b ? a : b; } bool cmpbig(int a, int b){ return a>b; } bool cmpsmall(int a, int b){ return a<b; } using namespace std; #define MAX 200010 set<int>maps[MAX], a,c; int path[MAX]; int main() { freopen("data.in", "r", stdin); int t; sf(t); while (t--) { mem(path, -1); int i, m, n; sf2(n, m); a.clear(); for (i = 1; i <= n; i++) { maps[i].clear(); a.insert(i); } for (i = 0; i < m; i++) { int u, v; sf2(u, v); maps[u].insert(v); maps[v].insert(u); } int s; sf(s); a.erase(s); path[s] = 0; queue<int>q; // a.erase(s); q.push(s); while (!q.empty()) { c.clear(); int now_pos = q.front(); q.pop(); for (set<int>::iterator it = a.begin(); it != a.end(); it++) { int pos = *it; if (maps[pos].find(now_pos) == maps[pos].end()) { path[pos] = path[now_pos] + 1; c.insert(pos); q.push(pos); } } for (set<int>::iterator it = c.begin(); it != c.end(); it++) a.erase(*it); } int flag = 0; for (i = 1; i <= n; i++) { if (i != s) flag ? printf(" %d", path[i]),flag++ : printf("%d", path[i]),flag++; } pfn; } return 0; }
可能有人会问,为何还加个c集合,直接循环里删a集合中的点不就可以了。这是因为it迭代器在不断的往后移位,而如果你在循环中a.erase()某个值,则it位置会不知何处,编译器会报错!(这确实是看了网上某苣代码 学到的新东西- -)
唉 ,,总结还是自己太菜。。
相关文章推荐
- 2016 ICPC 大连网络赛 HDU 5876 Sparse Graph
- 【2016-大连赛区网络赛-I】补图最短路(Sparse Graph,hdu 5876)
- hdu 5876 - Sparse Graph(2016大连网络赛) bfs
- 【icpc网络赛大连赛区】Sparse Graph
- HDU 5867 Sparse Graph (2016年大连网络赛 I bfs+补图)
- Sparse Graph(2016大连网赛)(hdu5876)(BFS+数据结构)
- HDU 5876 大连网络赛 Sparse Graph
- HDU 5876 大连网络赛 Sparse Graph
- 补图上的BFS大连网络赛Sparse Graph
- HDU 5876 Sparse Graph 大连网络赛
- 2016 ACMICPC Asia Regional Dalian Online 1009 Sparse Graph
- hdu 5876 Sparse Graph(补图最短路) 2016 ACM/ICPC Asia Regional Dalian Online 1009
- HDU 5876 Sparse Graph(bfs求解补图中的单源最短路)——2016 ACM/ICPC Asia Regional Dalian Online
- 2016 ICPC 大连网络赛 HDU 5873 Football Games
- HDU 5875 Function -2016 ICPC 大连赛区网络赛
- HDU 5876 Sparse Graph (补图BFS) 2016 ACM/ICPC Asia Regional Dalian Online
- 【2016-大连赛区网络赛-H】优化(Function,hdu 5875)
- 2016 ICPC 大连网络赛 HDU 5874 Friends and Enemies
- 2016 大连网络赛 hdu 5876 ACM ICPC(补图求最短路)
- 【2016-大连赛区网络赛-G】(Friends and Enemies,hdu 5874)