一: #include<stdio.h> #include<malloc.h> #include<string.h> #define false 0 #define true 1 int vid[110]; typedef struct arc { int adj; struct arc *nextarc; }arctype; typedef struct { int vertex; arctype *firstace; }vertextype; typedef vertextype adjlist[100]; int locvertex(adjlist graph,int v2) { int i; for(i=0;i<100;i++) { if(graph[i].vertex ==v2) return i; } } short int visited[100]; void dfs(adjlist graph,int v) { arctype * p; int w; printf("%d ",graph[v].vertex ); vid[v]=1; p=graph[v].firstace ; p=p->nextarc; w=p->adj ; while(p!=NULL ) { if(vid[w]==0) dfs(graph,w); p=p->nextarc; if(p!=NULL) w=p->adj; } } main() { int n,e,i,k,j; int v1,v2; arctype * q,*p; adjlist graph; printf("输入顶点的顶点数和边数:/n"); scanf("%d%d",&n,&e); printf("输入顶点/n"); for(i=0;i<n;i++) { scanf("%d",&graph[i].vertex); graph[i].firstace =NULL; } printf("输入图中的各边,弧尾和弧头编号:/n"); for( k=0;k<e;k++) { scanf("%d%d",&v1,&v2); i=locvertex(graph,v1); j=locvertex(graph,v2); q=(arctype *)malloc(sizeof(arctype)); q->adj =v2; q->nextarc =graph[i].firstace ; graph[i].firstace =q; p=(arctype*)malloc(sizeof(arctype)); p->adj =v1; p->nextarc =graph[j].firstace ; graph[j].firstace =p; } for(i=0;i<n;i++) { printf("%d ",graph[i].vertex ); p=graph[i].firstace ; while(p!=NULL) { printf("-->"); printf("%d ",p->adj ); p=p->nextarc ; } printf("-->NULL"); printf("/n"); } memset(vid,0,sizeof(vid)); dfs(graph,1); } 二(来源于大哥,不涉及指针): #include<iostream> using namespace std; struct node { int v,cost,dis,next; }; node child[10005]; bool vis[105]; int head[105],K,N,R,len,Ans; void add(int a,int b,int c,int d) { child[++len].v=b; child[len].dis=c; child[len].cost=d; child[len].next=head[a]; head[a]=len; } void dfs(int v,int dis,int money) { //printf("%d %d %d /n",v,dis,money); //system("pause"); int i; if(dis>Ans) return ; if(v==N) { if(money>=0&&dis<Ans) Ans=dis; } for( i=head[v]; i; i=child[i].next ) if(money-child[i].cost>=0&& vis[child[i].v] ) { vis[child[i].v]=false; dfs(child[i].v,dis+child[i].dis,money-child[i].cost); vis[child[i].v]=true; } } int main() { int i,j,a,b,c,d; len=0; scanf("%d%d%d",&K,&N,&R); for (i=1;i<=R;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); add(a,b,c,d); } Ans=99999999; memset(vis,true,sizeof(vis)); dfs(1,0,K); if(Ans==99999999) printf("-1/n"); else printf("%d/n",Ans); //system("pause"); return 0; } 三(来源学长,也很巧妙):