最短路(set存储)大连网络赛

Sparse Graph

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 3078    Accepted Submission(s): 443


Problem Description
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

题解:

#include  #include #include #include #include #include #include #include  #include #include #include using namespace std; queueq; const int MAX=2e5+5; set s[MAX],a,c; int pathlen[MAX]; set::iterator it; int main()  { int T; int n,m; scanf("%d",&T); while(T--) { memset(pathlen,-1,sizeof(pathlen)); a.clear(); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { s[i].clear(); a.insert(i); } for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); s[u].insert(v); s[v].insert(u); } int ss; scanf("%d",&ss); a.erase(ss); q.push(ss); pathlen[ss]=0; while(!q.empty()) { c.clear(); int now_pos=q.front(); q.pop(); for(it=a.begin();it!=a.end();it++) { int pos=*it; if(s[pos].find(now_pos)==s[pos].end()) { pathlen[pos]=pathlen[now_pos]+1; q.push(pos); c.insert(pos); } } for(it=c.begin();it!=c.end();it++) { a.erase(*it); } } int flag=0; for(int i=1;i<=n;i++) { if(i!=ss) flag?printf(" %d",pathlen[i]),flag++ : printf("%d",pathlen[i]),flag++; } } return 0; }

你可能感兴趣的:(ACM—最短路)