http://acm.hdu.edu.cn/showproblem.php?pid=2962 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; #define N 1001 #define M 1000005 #define inf 0x7fffffff int bin[N]; struct Road { int u,v,h,w; }p[M]; struct Graph { int NV,NE; int dis[N]; bool h[N]; int head[N]; struct Node { int v,next,w; Node(){}; Node(int a,int b,int c):next(a),v(b),w(c){}; }E[M]; void init(int n) { NE=0; NV=n; memset(head,-1,sizeof(head)); for(int i=0;i<=n;i++) bin[i]=i; } void insert(int u,int v,int w) { E[NE]=Node(head[u],v,w); head[u]=NE++; } bool update(int u,int v,int w) { if(dis[v]>dis[u]+w) { dis[v]=dis[u]+w; return true; } return false; } int spfa(int beg,int end) { queue<int> q; q.push(beg); for(int i=0;i<=NV;i++) { dis[i]=inf; h[i]=0; } dis[beg]=0; while(!q.empty()) { int u=q.front(); q.pop(); h[u]=0; for(int i=head[u];i!=-1;i=E[i].next) { int v=E[i].v; if(update(u,v,E[i].w)&&!h[v]) { h[v]=1; q.push(v); } } } return dis[end]; } }G; bool cmp(Road a,Road b) { return a.h>b.h; } int find(int x) { if(x==bin[x]) return x; return bin[x]=find(bin[x]); } void merge(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) bin[fx]=fy; } int main(void) { int n,m,i; int k=1; while(scanf("%d%d",&n,&m),n||m) { G.init(n); for(i=0;i<m;i++) { scanf("%d%d",&p[i].u,&p[i].v); scanf("%d%d",&p[i].h,&p[i].w); if(p[i].h==-1) p[i].h=inf; } int beg,end; int H; scanf("%d%d%d",&beg,&end,&H); sort(p,p+m,cmp); for(i=0;i<m;i++) { merge(p[i].u,p[i].v); if(find(beg)==find(end)) { if(p[i].h<H) H=p[i].h; break; } } if(k!=1) printf("/n"); printf("Case %d:/n",k++); if(i==m) { printf("cannot reach destination/n"); continue; } for(i=0;i<m;i++) { if(p[i].h>=H) { G.insert(p[i].u,p[i].v,p[i].w); G.insert(p[i].v,p[i].u,p[i].w); } else break; } int ans=G.spfa(beg,end); printf("maximum height = %d/n",H); printf("length of shortest route = %d/n",ans); } } 晕死!!!边开小的错误又犯了,悲剧的是结果返回 TLE,p[N]还是p[M].....貌似自己很偏爱给p开N的范围。。。注意注意!!