做广告:
#includeint main(){ puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44308173");}
题意:
求是否有长度为K的路径。
每组数据 N,表示树有N个点。 然后N行,每行若干个数对(a,b),当中第i行时表示i到a有一条长为b的无向边。输入到0截止。 然后若干个数表示K,每一个数输出下。 到0为止。
然后数据的N也是到0为止。
存在puts("AYE");
否则 puts("NAY");
每组数据最后输出一个dot,就是 .
题解:
三倍经验题,
POJ1987 POJ1741代码:
#include#include #include #include #define N 10100#define inf 0x3f3f3f3fusing namespace std;int n,m;struct Eli{ int v,len,next;}e[N<<1];int head[N],cnt;bool rem[N];inline void add(int u,int v,int len){ e[++cnt].v=v; e[cnt].len=len; e[cnt].next=head[u]; head[u]=cnt;}int f[N],f2[N],son[N];int TreeCenter,length;int dfs1(int x,int p){ int i,v; f[x]=f2[x]=0; for(i=head[x];i;i=e[i].next) { v=e[i].v; if(v==p||rem[v])continue; int temp=dfs1(v,x); if(temp>f[x]) { f2[x]=f[x]; f[x]=temp; son[x]=v; } else if(temp>f2[x]) f2[x]=temp; } return f[x]+1;}int g[N];void dfs2(int x,int p){ int i,v; if(max(f[x],g[x]) m)p--; if(i>=p)break; for(j=p;j>i&&src[i].a+src[j].a==m;j--) if(src[i].b!=src[j].b)return 1; if(src[i+1].a!=src[i].a)p=j; } for(i=head[x];i;i=e[i].next) { v=e[i].v; if(rem[v])continue; if(work(v,size[v]-1))return 1; } return 0;}int main(){ freopen("test.in","r",stdin); int i,a,b,c; while(scanf("%d",&n),n) { cnt=0; memset(head,0,sizeof head); for(i=1;i<=n;i++) { while(scanf("%d",&a),a) { scanf("%d",&b); add(i,a,b),add(a,i,b); } } while(scanf("%d",&m),m) { memset(rem,0,sizeof rem); if(work(1,n-1))puts("AYE"); else puts("NAY"); } puts("."); } return 0;}
版权声明:本文博主原创文章,博客,未经同意不得转载。