hdu 5876 暴力
来源:互联网 发布:松下fp xh编程手册 编辑:程序博客网 时间:2024/05/06 07:59
链接:戳这里
Sparse Graph
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
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 N−1 other vertices.
Input
There are multiple test cases. The first line of input is an integer T(1≤T<35) denoting the number of test cases. For each test case, the first line contains two integers N(2≤N≤200000) and M(0≤M≤20000). The following M lines each contains two distinct integers u,v(1≤u,v≤N) denoting an edge. And S (1≤S≤N) is given on the last line.
Output
For each of T test cases, print a single line consisting of N−1 space separated integers, denoting shortest distances of the remaining N−1 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
题意:
n个点m条边的图,给定一个点S,要求输出再补图上,S到所有点的最短路径
思路:
找出独立的点X(没有边连),那么S到X的距离为1,到其他的所有在图上的点距离为2
如果不存在独立的点,那么图很小,二维数组存边跑dijkstra
代码:
#include <iostream>#include <vector>#include <cmath>using namespace std;int vis[200100];int n,m,S,X;int anw[200100];int u[20010],v[20010];vector <int> V;int a[10010][10010];int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) vis[i]=0; for(int i=1;i<=n;i++) anw[i]=0; V.clear(); for(int i=1;i<=m;i++) scanf("%d%d",&u[i],&v[i]); scanf("%d",&S); for(int i=1;i<=m;i++){ vis[u[i]]=vis[v[i]]=1; if(u[i]==S) V.push_back(v[i]); else if(v[i]==S) V.push_back(u[i]); } X=-1; for(int i=1;i<=n;i++){ if(i!=S && !vis[i]) { X=i; break; } } if(X!=-1){ int cnt=V.size(); for(int i=0;i<cnt;i++) anw[V[i]]=2; for(int i=1;i<=n;i++) { if(!anw[i]) anw[i]=1; } anw[S]=0; } else { for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j) a[i][j]=0; else a[i][j]=a[j][i]=1; } } for(int i=1;i<=m;i++){ a[u[i]][v[i]]=1e9; a[v[i]][u[i]]=1e9; } for(int i=1;i<=n;i++) vis[i]=0; for(int i=1;i<=n;i++) anw[i]=1e9; anw[S]=0; int flag=0; for(int i=1;i<n;i++){ int f=-1,mn=1e9; for(int j=1;j<=n;j++){ if(!vis[j] && anw[j]<mn){ f=j; mn=anw[j]; } } if(f==-1){ flag=1; break; } vis[f]=1; for(int j=1;j<=n;j++){ if(!vis[j] && anw[f]+a[f][j]<anw[j]){ anw[j]=anw[f]+a[f][j]; } } } if(flag){ printf("-1\n"); continue; } } if(S==1) { for(int i=2;i<n;i++) printf("%d ",anw[i]); printf("%d\n",anw[n]); } else { printf("%d",anw[1]); for(int i=2;i<=n;i++){ if(anw[i]) printf(" %d",anw[i]); } printf("\n"); } } return 0;}/*104 31 22 33 42*/
0 0
- hdu 5876 暴力
- 【字符串暴力】hdu 2847
- HDU **** 暴力模拟
- HDU-1128 暴力搜索
- hdu 2438 暴力吧
- HDU 4175 暴力求解
- hdu 3332 暴力枚举
- HDU 3823 暴力枚举
- hdu 4608 暴力大数
- hdu 1702 暴力
- hdu 4585 shaolin (暴力)
- HDU 4576 Robot (暴力)
- hdu 3711 暴力
- HDU 3697 暴力贪心
- hdu 4499 Cannon(暴力)
- hdu 1394 暴力
- hdu 3720 暴力枚举
- hdu 4995 暴力
- 反射
- Vijos 1082 最短路
- LeetCode 24:Swap Nodes in Pairs
- andorid添加桌面快捷方式
- MySql update inner join!MySql跨表更新 多表update sql语句?如何将select出来的部分数据update到另一个表里面?
- hdu 5876 暴力
- :jsonp的原理
- poj--3258 River Hopscotch(最大化最小值)
- int; int*; int&区别
- Jvm工作原理学习笔记
- 2015 Multi-University Training Contest 1 OO’s Sequence
- SqlCommand类
- 文章标题
- 柱形图