建图很巧妙,必须掌握了,不需指针!对比赛很实用! #include<stdio.h> #include<string.h> struct node { int v,dis,cost,next; }edge[10005]; int head[105]; bool vis[105]; int n,k,m,len,ans; void add(int a,int b,int c,int d) { edge[++len].v=b; edge[len].cost =d; edge[len].dis =c; edge[len].next =head[a]; head[a]=len; } void dfs(int v,int dis,int money) { if(dis>ans) return ; if(v==n) { if(money>=0&&dis<ans) ans=dis; } for(int i=head[v];i;i=edge[i].next ) { if(vis[edge[i].v]&&money-edge[i].cost >=0) { vis[edge[i].v]=false; dfs(edge[i].v,dis+edge[i].dis ,money-edge[i].cost ); vis[edge[i].v]=true; } } } int main() { int i,a,b,c,d; scanf("%d%d%d",&k,&n,&m); while(m--) { scanf("%d%d%d%d",&a,&b,&c,&d); add(a,b,c,d); } ans=999999999; memset(vis,true,sizeof(vis)); dfs(1,0,k); if(ans==999999999) printf("%d/n",-1); else printf("%d/n",ans); return 0; } 对于此题,用dij+优先队列更优 #include<iostream> #include<cstdio> #include<queue> using namespace std; int k,n,r; struct node { int v,l,t,next; }e[10005]; int head[1005],index; struct qq//构造优先队列中的函数 { int u,l,t; friend bool operator<(qq a,qq b){ if(a.l!=b.l)return a.l>b.l; return a.t>b.t; } }; int main() { scanf("%d",&k); scanf("%d%d",&n,&r); index=1; int a,b,len,cost,i; memset(head,0,sizeof(head)); while(r--) { scanf("%d%d%d%d",&a,&b,&len,&cost); e[index].v=b; e[index].l =len; e[index].t=cost; e[index].next =head[a]; head[a]=index++; } qq u={1,0,0};//源点进队列 priority_queue<qq>q;//优先队列 q.push (u); int ans=-1; while(!q.empty ()) { qq t; t=q.top ();q.pop (); int x=t.u; if(x==n) { ans=t.l; break; } for(i=head[t.u];i;i=e[i].next ) { if(t.t+e[i].t <=k) { qq h; h.u=e[i].v; h.l=t.l+e[i].l; h.t=t.t+e[i].t; q.push (h); } } } printf("%d/n",ans); return 0; }