趁机就再写一篇吧。。

以前没写完整放在桌面上了,今天索性把它写好。

也是最短路题,只不过多了一些个处理!

n为1000, 用floyd必须超时,果断选择了Dijkstra ;这个题目有点像回溯,但是比回溯的简单一点!

汉 语 题目 大家应该都可以理解吧。。

直接贴代码啦:

View Code
1 # include<stdio.h>
2 # include<string.h>
3 # define Min 0xfffffff
4 int adj[1005][1005],visit[1005],tax[1005][1005],pay[1005],low[1005];
5 int main()
6 {
7 int i,a,b,d,p,s,t,n,m,index,index1,min;
8 while(scanf("%d%d",&n,&m)!=EOF)
9 {
10 if(n==0 && m==0) break;
11 memset(adj,-1,sizeof(adj));
12 for(i=1;i<=m;i++)
13 {
14 scanf("%d%d%d%d",&a,&b,&d,&p);
15 if(adj[a][b]==-1 || adj[a][b]>d) {adj[a][b]=d; adj[b][a]=d;tax[a][b]=p;tax[b][a]=p;}
16 }
17 scanf("%d%d",&s,&t);
18 for(i=0;i<=n;i++)
19 {
20 visit[i]=0;
21 low[i]=Min;
22 pay[i]=-1;
23 }
24 index=s;
25 low[s]=0;
26 pay[s]=0;
27 while(index!=t)
28 {
29 visit[index]=1;
30 min=Min;
31 for(i=1;i<=n;i++)
32 {
33 if(visit[i]==1) continue;
34 if(adj[i][index]==-1 && low[i]==Min) continue;
35 if(adj[i][index]!=-1)
36 {
37 if(adj[i][index]+low[index] < low[i] || low[i]==Min) {low[i]=low[index]+adj[i][index]; pay[i]=pay[index]+tax[i][index];}
38 else if(adj[i][index]+low[index]==low[i] && pay[i]>pay[index]+tax[i][index]) pay[i]=pay[index]+tax[i][index];
39 }
40 if(low[i]<min) {min=low[i];index1=i;}
41 else if(low[i]==min && pay[i]<pay[index1]) {min=low[i];index1=i;}
42 }
43 index=index1;
44 }
45 printf("%d %d\n",low[t],pay[t]);
46 }
47 return 0;
48 }

弱弱的问一句,大家看我的代码能否看懂啊??

漫漫 学会加注释吧!

posted on 2011-03-17 09:24  奋斗青春  阅读(558)  评论(0编辑  收藏  举报