博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大连acm hdu 5876 补图
阅读量:5316 次
发布时间:2019-06-14

本文共 2817 字,大约阅读时间需要 9 分钟。

题目:http://hdu.hustoj.com/showproblem.php?pid=5876 

 In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if and only if they are not adjacent in G.

Now you are given an undirected graph G of N nodes and M bidirectional edges of unit length. Consider the complement of G, i.e., H. For a given vertex S on H, you are required to compute the shortest distances from S to all N1 other vertices.

 

Input
There are multiple test cases. The first line of input is an integer
T(1T<35) denoting the number of test cases. For each test case, the first line contains two integers N(2N200000) and M(0M20000). The following M lines each contains two distinct integers u,v(1u,vN) denoting an edge. And S (1SN) is given on the last line.
 

Output
For each of
T test cases, print a single line consisting of N1 space separated integers, denoting shortest distances of the remaining N1 vertices from S (if a vertex cannot be reached from S, output ``-1" (without quotes) instead) in ascending order of vertex number.
 

Sample Input
1 2 0 1
 

Sample Output
1
 

Source
 
 
 
 
题意:  给你1样例
            给你n个点和m条边
            输入m条边后
            输入起点s
 
      求原图的补图中,,起点s到各个点的最短距离并输出   
     补图 ;   一个n个点的图有n*(n-1)*0.5条边,,,除去原图上的边剩下的所有边组成补图
  
概念如图 ;
  
                                   
                        
 
 
好了题意清楚了,,其实刚开始想法很简单,,不就是补图嘛,,通过原来的图把补图还原出来,直接迪杰就ok
 
但是复杂度过高,优化是不可能的,,所以又找到了一种做法  因为只会出现3种答案吧(-1,,1,,2)
 
从起点找起,,把和起点没有联系的点用队列存起来,如图就是存4和5    更新dis[4]和dis[5]=1    
从队列中取出4和5 分别为起点  找没有联系的点3和2   更新队列和dis[3],,dis[2]=dis[4]+1;
 
好了方法已经找到了,,写出来了也,,但是还是超时 ,,想半天原来红色区域的查找复杂度也有n*(n-x)*(n-x)....显然超时
 
怎么办呢,,想到了set维护,,set能跟快速的管理和查找删除 所需要的元素  所以代码就出来了  因为对于set的维护还不熟悉只能看别人的代码,,实力太弱
 
对着网上写的代码:后面会补上自己的代码
 
#include
#include
#include
#include
#include
#include
#include
#include
#define maxn 200005using namespace std;int n,m,s;int x,y;set
book;//存所有没扩展到的点set
mp[maxn]; //存原图int ans[maxn]; // 最短距离void bfs(int s){ ans[s]=0; queue
que; que.push(s); //把起点存入队列 for(int i=1;i<=n;i++) { if(i!=s)book.insert(i); //所有点先存入 } set
del; //存要删除的已访问的点 while(!que.empty()) { int now=que.front(); que.pop(); set
::iterator it; del.clear(); //清空所有元素 for(it=book.begin();it!=book.end();it++) //查找与now没有连接的点 可以说是这题的难点所在 { if(!mp[now].count(*it)) //返回mp[now]的元素个数 { if(ans[*it]==-1) { ans[*it]=ans[now]+1; del.insert(*it); que.push(*it); } } } for(it=del.begin();it!=del.end();it++) { book.erase(*it); //删除book里的已经访问元素 } }}int main(){ int t; cin>>t; while(t--) { cin>>n>>m; memset(ans,-1,sizeof(ans)); //初始化ans数组 for(int i=0;i<=n;i++) { mp[i].clear(); //清空mp } book.clear(); //清空book for(int i=0;i
>x>>y; mp[x].insert(y); mp[y].insert(x); //双向存点 } cin>>s; bfs(s); // 以下是输出格式 for(int i=1;i<=n;i++) { if(s==i)continue; cout<

思路并不复杂,,就是想要维护操作的时候想不到

 

 

转载于:https://www.cnblogs.com/huangzzz/p/8666415.html

你可能感兴趣的文章
数据持久化时的小bug
查看>>
bzoj2257
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
变量提升
查看>>
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>
tensorflow的graph和session
查看>>
JavaScript动画打开半透明提示层
查看>>
jquery-jqzoom 插件 用例
查看>>
1007. Maximum Subsequence Sum (25)
查看>>
查看oracle数据库的连接数以及用户
查看>>
【数据结构】栈结构操作示例
查看>>
三.野指针和free
查看>>
activemq5.14+zookeeper3.4.9实现高可用
查看>>
TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议
查看>>
简单【用户输入验证】
查看>>
python tkinter GUI绘制,以及点击更新显示图片
查看>>