您的位置:首页 > 理论基础 > 计算机网络

2016大连网络赛Sparse Graph

2016-09-11 21:55 525 查看
唉,比赛时首先想到了bfs,没想太多直接交一发超时,然后开始用set建领结表,set维护未被访问的点优化,结果无限mlt,挂了5小时机,最后还是由队友打掉了这题。。。
其实,这题很好想,逆着想想,就是补图的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位置会不知何处,编译器会报错!(这确实是看了网上某苣代码 学到的新东西- -)
唉 ,,总结还是自己太菜。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息