poj 1523 割点

来源:互联网 发布:网络调查兼职 编辑:程序博客网 时间:2024/05/01 05:32

这道题比圆桌骑士简单,只是那个算法的一部分,但是我的坏习惯越来越明显了,每次因为马虎的WA都不会自己找错误,而且每次都是去找测试数据然后去解决wa的,以后一定不能这样了,因为这样ac了也没有成就感啊!而且以后没有测试数据了该怎么办?

#include<iostream>#include<cstdio>#include<string>#include<cstdio>#include<cmath>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<climits>using namespace std;#define max(a,b) (a)>(b)?(a):(b)#define min(a,b) (a)<(b)?(a):(b) #define rep(i,n) for(i=0; i<(n); i++)#define reph(i,n,m) for(i=(n); i<=(m); i++)//正循环的#define repd(i,n,m) for(i=(m); i>=(n); i--) //负循环的#define max(a,b) (a)>(b)?(a):(b)#define min(a,b) (a)<(b)?(a):(b)#define fab(a) (a)>0?(a):0-(a)#define arc(a) (a)*(a)#define inf 10000000   //最大值的#define exp 0.0000001     //浮点型的#define N   1010  //记录开的数组typedef struct fun{int y,pre;}rr;fun a[N];int pre[N];bool sign[N];int sum[N];int n,m,len;int Stack[N],dfn[N],low[N];int tot;void add(int s,int t){     a[len].y=t; a[len].pre=pre[s];  pre[s]=len++; }void dfs(int x,int s){Stack[len++]=x;dfn[x]=low[x]=tot++;sign[x]=true;//代表进栈了int i,y;for(i=pre[x];i!=0; i=a[i].pre){        y=a[i].y;if(y==s)//一条边的来回的continue;if(!sign[y])//没有进栈{dfs(y,x);low[x]=min(low[x],low[y]);if(low[y]>=dfn[x]){sum[x]++;//代表分支加一while(Stack[len]!=y)len--;}}elselow[x]=min(low[x],low[y]);}if(sum[x]!=0 && dfn[x]!=1)//为割点并且其上面还有部分的sum[x]++;}int main(){int s,t,rr=0;;while(scanf("%d",&s) && s){ memset(pre,0,sizeof(pre)); memset(sign,false,sizeof(sign)); memset(sum,0,sizeof(sum)); len=0; rr++;         scanf("%d",&t); len=1; add(s,t); add(t,s); n=0; m=10000;          n=max(max(s,t),n); m=min(min(s,t),m); while(scanf("%d",&s) &&s) { scanf("%d",&t); n=max(max(s,t),n);     m=min(min(s,t),m); add(s,t); add(t,s); }int i;  tot=1; len=1;  reph(i,m,n) { if(!sign[i])//没有入栈的 dfs(i,-1); } printf("Network #%d\n",rr); int flag=0; reph(i,m,n) { if(sum[i]>1) {                  flag=1;  printf("  SPF node %d leaves %d subnets\n",i,sum[i]); } } if(flag==0) printf("  No SPF nodes\n"); printf("\n");}    return 0;}


 

原创粉丝点击