看得是http://blog.csdn.net/kongming_acm/article/details/5741538朋友的代码这里附上我的理解
#include<iostream> using namespace std; int x[501],y[501],l[501],v[501],h[501],n,p,flag=0; void dfs(int k) { int i,hh,o; if (flag)return; v[k]=1;//标记第k个为读取过的 for(i=1;i<=p;i++)//循环看有没有头是k或尾是k if ((x[i]==k)||(y[i]==k)) { o=x[i]+y[i]-k;//顺便算出另一个 hh=(x[i]==k?h[k]+l[i]:h[k]-l[i]);//算高度 if ((v[o])&&(h[o]!=hh))//如果另一个点已经特么被标记了,就说明有圈,如果h[o]也不对劲那就是见鬼了 { flag=1;return; } h[o]=hh;算出另一个点的高度 if(!v[o])dfs(o);递归 } } int main() { cin>>n>>p; int i,min=0; for(i=1;i<=p;i++) cin>>x[i]>>y[i]>>l[i]; h[1]=0; dfs(1);//从第一个开始看 if (flag) cout<<-1<<endl; else{ for(i=1;i<=n;i++) if(h[i]<min) min=h[i]; for(i=1;i<=n;i++) cout<<h[i]-min<<endl; } return 0; }
原文:http://www.cnblogs.com/zhko11993/p/3819620.html