首页 > 代码库 > icpc大连站网络赛 1009 补图最短路
icpc大连站网络赛 1009 补图最短路
BFS+链表
代码改自某博客
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<string> 7 #include<map> 8 #include<set> 9 #include<vector> 10 #include<queue> 11 using namespace std; 12 const int maxn = 2e5+5; 13 const int INF = 0x3f3f3f3f; 14 const int A=INF; 15 const int B=1; 16 typedef long long LL; 17 int h[maxn],e; 18 LL dis[maxn]; 19 bool vis[maxn]; 20 int start; 21 22 struct Edge 23 { 24 int v,nxt,w; 25 } E[maxn<<1]; 26 27 void init() 28 { 29 e=0; 30 memset(h,-1,sizeof h); 31 memset(vis,false,sizeof vis); 32 } 33 34 void add(int u,int v,int w) 35 { 36 E[e].v = v; 37 E[e].w = w; 38 E[e].nxt = h[u]; 39 h[u] = e++; 40 } 41 42 struct QNode 43 { 44 int v,c; 45 QNode(int _v,int _c) 46 { 47 v = _v; 48 c=_c; 49 } 50 bool operator < (const QNode &a) const 51 { 52 return c>a.c; 53 } 54 }; 55 56 void dijkstra(int n) 57 { 58 memset(dis,INF,sizeof dis); 59 priority_queue<QNode>Q; 60 dis[1] = 0; 61 Q.push(QNode(1,0)); 62 while(!Q.empty()) 63 { 64 QNode tmp = Q.top(); 65 Q.pop(); 66 int u = tmp.v; 67 if(vis[u]) continue; 68 vis[u] = true; 69 for(int i=h[u]; ~i; i=E[i].nxt) 70 { 71 int v = E[i].v; 72 int w = E[i].w; 73 if(vis[v]) continue; 74 if(dis[u]+w<dis[v]) 75 { 76 dis[v] = dis[u]+w; 77 Q.push(QNode(v,dis[v])); 78 } 79 } 80 } 81 } 82 83 void BFS(int n,LL val) 84 { 85 set<int>ta,tb; 86 queue<int>Q; 87 Q.push(start); 88 dis[start] = 0,dis[n] = INF; 89 for(int i=1; i<=n; i++){ 90 if(i==start) continue; 91 ta.insert(i); 92 } 93 while(!Q.empty()) 94 { 95 int u = Q.front(); 96 Q.pop(); 97 for(int i=h[u]; ~i; i=E[i].nxt) 98 { 99 int v = E[i].v;100 if(!ta.count(v)) continue;101 ta.erase(v);102 tb.insert(v);103 }104 for(set<int>::iterator it=ta.begin(); it!=ta.end(); it++)105 {106 Q.push(*it);107 dis[*it] = dis[u] + val;108 }109 ta.swap(tb);110 tb.clear();111 }112 }113 114 int main()115 {116 int N,M,T;117 int u,v;118 while(scanf("%d",&T)!=EOF)119 {120 while(T--)121 {122 scanf("%d%d",&N,&M);123 init();124 bool flag = false;125 for(int i=0; i<M; i++)126 {127 scanf("%d%d",&u,&v);128 add(u,v,A);129 add(v,u,A);130 131 }132 scanf("%d",&start);133 dijkstra(N);134 BFS(N,B);135 bool first=0;136 for(int i=1;i<=N;i++)137 {138 if(i==start) continue;139 if(first) printf(" ");140 printf("%d",dis[i]);141 first=1;142 }143 printf("\n");144 }145 }146 return 0;147 }148 149 150 /*151 152 1153 2 0154 1155 156 */
icpc大连站网络赛 1009 补图最短路
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。