題目:這裏php
題意:node
至關於一開始給一個初始好了的無向徹底圖給你,而後給讓你刪除m條邊,再給你一個點v,最後問你在剩下的圖裏從這個點v出發能到達全部邊點的最小路徑是多少?ios
一看是全部點的最小路徑,一看就以爲是個bfs,記憶化搜一下而後加個優化什麼的,因爲數據不知道是個什麼奇葩並且比賽中還改數據,因此不少人wa的莫名其妙,數組
過也過的莫名其妙,我雖然過了但以爲有點不靠譜,賽後看了https://async.icpc-camp.org/d/546-2016的題解思路寫了一發,總感受更靠譜一點。async
以前本身過的,就是用set記錄那刪掉的m條邊,dis[i]數組記錄每一個結點的最小路徑,當全部的點都搜到過的時候就能夠結束了優化
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<set> 6 #include<queue> 7 using namespace std; 8 9 const int M = 2e5 + 10; 10 set<int>s[M]; 11 int n;bool vis[M]; 12 int dis[M],ans; 13 14 int min(int x,int y){return x<y?x:y;} 15 16 struct node{ 17 int po,dis; 18 }; 19 20 void bfs(int pos) 21 { 22 memset(vis,false,sizeof(vis)); 23 queue<node>p; 24 node now,next; 25 now.po=pos;now.dis=0; 26 p.push(now); 27 vis[pos]=true; 28 while (!p.empty()){ 29 now=p.front(); 30 p.pop(); 31 for (int i=1 ; i<=n ; i++){ 32 next.po=i;next.dis=now.dis+1; 33 if (next.po==now.po) continue; 34 if (vis[next.po]) continue; 35 bool flag=false; 36 if (s[now.po].find(next.po)!=s[now.po].end()) 37 flag=true; 38 if (flag) continue; 39 vis[next.po]=true; 40 dis[next.po]=min(next.dis,dis[next.po]); 41 p.push(next);ans++; 42 } 43 if (ans==n) return ; 44 } 45 } 46 47 48 49 int main() 50 { 51 int t; 52 scanf("%d",&t); 53 while (t--){ 54 int m; 55 scanf("%d%d",&n,&m); 56 for (int i=1 ; i<=n ; i++) s[i].clear(),dis[i]=M; 57 while (m--){ 58 int u,v; 59 scanf("%d%d",&u,&v); 60 s[u].insert(v); 61 s[v].insert(u); 62 } 63 int pos; 64 scanf("%d",&pos); 65 ans=1; 66 bfs(pos); 67 if (n!=pos){ 68 for (int i=1 ; i<=n ; i++){ 69 if (i==pos) continue; 70 if (i!=n) printf("%d ",dis[i]); 71 else printf("%d\n",dis[i]); 72 } 73 } 74 else{ 75 for (int i=1 ; i<n ; i++){ 76 if (i!=n-1) printf("%d ",dis[i]); 77 else printf("%d\n",dis[i]); 78 } 79 } 80 } 81 return 0; 82 }
後來看了別人的思路本身寫的spa
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<set> #include<queue> using namespace std; const int M = 2e5 + 10; int n,di[M],head[M],cas; struct Edge{ int to,next; }edge[M*2]; void add(int u,int v) { edge[++cas].next=head[u]; edge[cas].to=v; head[u]=cas; } int min(int x,int y){return x<y?x:y;} struct node{ int po,dis; }; void bfs(int pos) { set<int>s,e; set<int>::iterator it; for (int i=1 ; i<=n ; i++) s.insert(i),di[i]=M; queue<node>p; s.erase(pos); node now,next; now.po=pos;now.dis=0; p.push(now); while (!p.empty()){ now=p.front(); p.pop(); for (int i=head[now.po] ; i ; i=edge[i].next){ int v=edge[i].to; if (s.find(v)==s.end()) continue; s.erase(v); e.insert(v); } for (it=s.begin() ; it!=s.end() ; it++){ next.po=*it;next.dis=now.dis+1; di[next.po]=min(next.dis,di[next.po]); p.push(next); } s.swap(e);e.clear(); } } int main() { int t; scanf("%d",&t); while (t--){ int m;cas=0; scanf("%d%d",&n,&m); memset(head,0,sizeof(head)); while (m--){ int u,v; scanf("%d%d",&u,&v); add(u,v);add(v,u); } int pos; scanf("%d",&pos); bfs(pos); if (n!=pos){ for (int i=1 ; i<=n ; i++){ if (i==pos) continue; if (i!=n) printf("%d ",di[i]); else printf("%d\n",di[i]); } } else{ for (int i=1 ; i<n ; i++){ if (i!=n-1) printf("%d ",di[i]); else printf("%d\n",di[i]); } } } return 0; }