1. 程式人生 > >vijos1325 桐桐的糖果計劃

vijos1325 桐桐的糖果計劃

iostream sca borde div order jos mst output 無法

Description

桐桐是一個快樂的小朋友,他生活中有許多許多好玩的事,讓我們一起來看看吧……

桐桐很喜歡吃棒棒糖。他家處在一大堆糖果店的附近。

但是,他們家的區域經常出現塞車、塞人等情況,這導致他不得不等到塞的車或人走光了他才能去買到他最愛吃的棒棒糖品種。於是,他去找市長幫他修路,使得每兩個糖果店之間至少有兩條完全不同的路。可是市長經費有限,於是讓桐桐找出哪些路被塞住後會使某些糖果店與糖果店間無法到達及最少的修路條數。你能幫助他吃到他最喜愛的糖果嗎?

註:1->3->2 和 1->3->4->2 為不完全不同的路,即不符合題意的路。

1->3->4->2 和 1->5->2 為完全不同的路,即符合題意的路。

Input

輸入第一行是兩個數n,m(n<=5000,m<=10000)

接下來的m行,每行兩個數i,j,表示i,j間有一條邊連接。

Output

輸出有兩行。第一行為塞住後就不可以到達某些糖果店的道路條數,第二行為最少的修路條數。

   1   2   3
   +---+---+ 
       |   |
       |   |
 6 +---+---+ 4
      / 5
     /
    /
 7 +

上圖是樣例所表示的一個圖。 下圖是改變後的圖,其中虛線表示應連接的邊。

   1   2   3
   +---+---+ 
   :   |   |
   :   |   |
 6 +---+---+ 4
      / 5  :
     /     :
    /      :
 7 + - - - -

Sample Input

7 7
1 2
2 3
3 4
2 5
4 5
5 6
5 7

Sample Output

3
2
 
 
 
今天突然想復習一下tarjan
這題寫的很明白,就是找環的個數,根據題目描述,判斷環就行了
我寫的很麻煩,dalao們寫的比我好多了..
#include<cstdio>
#include<iostream>
#include<vector>
#include<stack>
#include<cstring>
using namespace std;
int head[5010],num[5010],low[5010
],vis[5010],cstack[5010],belong[5010],in[5010],step=0,count=0; struct map { int a; int b; }; map map1[20200]; stack<int>mstack; void make(int i,int x,int y) { map1[i].a=y; map1[i].b=head[x]; head[x]=i; } bool choose(int x,int y) { if((x&1)!=0&&y==x+1) return true; if((x&1)==0&&y==x-1) return true; return false; } void tarjan(int v,int e) { int i,j,l,u; step++; num[v]=step; low[v]=step; vis[v]=1; cstack[v]=1; mstack.push(v); for(i=head[v];i;i=map1[i].b) { if(choose(i,e)==1) continue; l=map1[i].a; if(vis[l]==0) { tarjan(l,i); low[v]=min(low[v],low[l]); } else if(cstack[l]) low[v]=min(low[v],num[l]); } if(low[v]==num[v]) { count++; do { u=mstack.top(); mstack.pop(); belong[u]=count; cstack[u]=0; }while(u!=v); } } int main() { int n,m,x,y,count1=0; int i,j; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); make(i*2-1,x,y); make(i*2,y,x); } for(i=1;i<=n;i++) if(vis[i]==0) tarjan(i,-1); printf("%d\n",count-1); for(i=1;i<=n;i++) for(j=head[i];j;j=map1[j].b) if(belong[i]!=belong[map1[j].a]) in[belong[i]]++; for(i=1;i<=count;i++) if(in[i]==1) count1++; if((count1-1)/2+1==1) cout<<"0"; else printf("%d",(count1-1)/2+1); }

vijos1325 桐桐的糖果計劃