典型的最短路,並且只要再加一點點操做,就能獲得答案數組
因此能夠直接套模板ide
具體看程序::spa
1 #include<cstdio> 2 #include<queue>//隊列專屬頭文件 3 #include<algorithm> 4 using namespace std; 5 const int N=100005; 6 int a[N]; 7 int n,m,l,sum,ans; 8 int d1[N],t[N],head1[N],next1[N],w1[N],adj1[N],k1; 9 bool f1[N]; 10 queue<int> q1;//比較喜歡定義全局變量 11 void add(int u,int v){//加邊操做,由於每條邊權值爲1,就不用第三個變量了 12 next1[++k1]=head1[u]; 13 head1[u]=k1; 14 w1[k1]=1;//若是不是1,就把一換成變量t(本身定義) 15 adj1[k1]=v; 16 } 17 void spfa(int s,int e){//SPFA,最短路模板 18 for(int i=1;i<=n;i++) 19 d1[i]=1<<30;//賦無限大 20 d1[s] =0; 21 q1.push(s); 22 f1[s]=true ; 23 while(!q1.empty()){ 24 int top1=q1.front() ; 25 q1.pop() ;//出隊 26 f1[top1]=false; 27 for(int j=head1[top1];j!=0;j=next1[j]){ 28 if(d1[adj1[j]]>d1[top1]+w1[j]){//鬆弛操做 29 t[adj1[j]]++; 30 d1[adj1[j]]=d1[top1]+w1[j] ; 31 if(!f1[adj1[j]]){ 32 q1.push(adj1[j]); 33 f1[adj1[j]]=true; 34 } 35 } 36 } 37 } 38 } 39 int main(){ 40 //freopen("hideseek.in","r",stdin); 41 //freopen("hideseek.out","w",stdout);不要在乎。。。 42 scanf("%d%d",&n,&m);//讀入 43 for(int i=1;i<=m;i++){ 44 int x,y; 45 scanf("%d%d",&x,&y); 46 add(x,y); 47 add(y,x);//加邊操做,由於是無向圖,要加兩次 48 } 49 spfa(1,n);//調用 50 for(int i=1;i<=n;i++){ 51 if(d1[i]>l){//若是出現了比如今大的點,就交換 52 l=d1[i]; 53 ans=i; 54 sum=1; 55 } 56 else{ 57 if(d1[i]==l){//同樣就加 58 sum++; 59 } 60 } 61 } 62 printf("%d %d %d\n",ans,l,sum);//輸出 63 return 0; 64 }
不用數組模擬隊列其實蠻麻煩的,我也只是套用模板,懶得改了,比才是現場寫仍是要寫本身有把握的code
那個。。新人開博鼓勵一下吧~~blog