看得是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