标签:des style blog http color os io strong
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10804 | Accepted: 3976 |
Description
Input
Output
Sample Input
5 6 7 1 2 2 3 2 4 3 3 3 4 2 4 1 3 4 1 4 6 2 1 3 5 2 0 5 4 3 2
Sample Output
11
Source
1 //邻接表存储结构+剪枝,优化时间复杂度 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 7 const int MAXWAY = 10010; 8 const int MAXCITY = 110; 9 const int INF = 0xffffff0; 10 struct Node{ 11 int s,d,l,t; 12 int next; //邻接表的表头指针 13 }Node[MAXWAY]; 14 int k,n,r; 15 int totallen; //存储当前路径中的路径长度 16 int totalcost; //存储当前路径中需要的话费 17 int minLen; //存储当前情况下最短的路径长度 18 int visited[110]; //存储是否访问过某个城市 19 20 int head[MAXWAY]; //存储链表信息 21 22 void DFS(int i) 23 { 24 if(i==n) 25 { 26 minLen = min(minLen,totallen); 27 return ; 28 } 29 else 30 { 31 for(int j=head[i];j!=-1;j=Node[j].next) //遍历 以i为起点的其他的所有 32 { 33 if(!visited[Node[j].d]) 34 { 35 if(totalcost+Node[j].t>k) //如果加上当前的这条路的费用超过了k,则跳过 36 continue; 37 if(totallen+Node[j].l>minLen) //如果在费用没有超过的情况下加上该条路的长度,超过了当前的最短长度,则跳过 38 continue; 39 totallen = totallen + Node[j].l; 40 totalcost = totalcost + Node[j].t; 41 visited[Node[j].d] = 1; 42 DFS(Node[j].d); 43 visited[Node[j].d] = 0; 44 totallen -= Node[j].l; 45 totalcost -= Node[j].t; 46 47 } 48 } 49 } 50 } 51 52 int main() 53 { 54 while(scanf("%d%d%d",&k,&n,&r)!=EOF) 55 { 56 memset(head,-1,sizeof(head)); 57 memset(visited,0,sizeof(visited)); 58 for(int i=0;i<r;i++) //接受数据同时,利用头插法建立邻接表 59 { 60 scanf("%d%d%d%d",&Node[i].s,&Node[i].d,&Node[i].l,&Node[i].t); 61 Node[i].next = head[Node[i].s]; //如果当前不存在元素,则此时的Node[i]就是尾节点,它的next是-1 62 //否则,Node[i].next就是指向当前的链表最头部的那个Node元素。 63 head[Node[i].s] = i; //修改当前的head[Node[i].s]的指向,使head[i]的值始终指向该条链表的头部元素,以便执行头插法 64 } 65 totallen = 0; 66 totalcost = 0; 67 minLen = INF; 68 DFS(1); 69 if(minLen<INF) 70 printf("%d\n",minLen); 71 else 72 printf("-1\n"); 73 } 74 return 0; 75 }
标签:des style blog http color os io strong
原文地址:http://www.cnblogs.com/jhldreams/p/3911896.html