symons

___________每一天都是幸福的!!

  博客园  ::  :: 新随笔  ::  :: 订阅 订阅  :: 管理

  这道题是最短路问题,开始卡了好久后来才发现是因为i,j坐标输入有问题。我更改了i,j坐标顺序才发现正确结果,坑啊!

  不过别的就是个裸地最短路了。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define INF 100000000
 6 #define maxn 25
 7 using namespace std;
 8 int n;
 9 int edge[maxn][maxn];
10 int dist[maxn];
11 int s[maxn];
12 int path[maxn];
13 struct point
14 {
15     int num,len;
16 }points[maxn];
17 bool cmp(point a,point b)
18 {
19     return a.len<b.len;
20 }
21 void dijkstra(int v0)
22 {
23     int i,j,k;
24     for(i=0;i<n;++i)
25     {
26         dist[i]=edge[v0][i];    s[i]=0;
27         if(i!=v0&&dist[i]<INF)    path[i]=v0;
28         else path[i]=1;
29     }
30     s[v0]=1;    dist[v0]=0;
31     for(i=0;i<n-1;++i)
32     {
33         int min=INF,u=v0;
34         for(j=0;j<n;++j)
35         {
36             if(!s[j]&&dist[j]<min)
37             {
38                 u=j;    min=dist[j];
39             }
40         }
41         s[u]=1;
42         for(k=0;k<n;++k)
43         {
44             if(!s[k]&&edge[u][k]<INF&&dist[u]+edge[u][k]<dist[k])
45             {
46                 dist[k]=dist[u]+edge[u][k];    path[k]=u;
47             }
48         }
49     }
50 }
51 int main()
52 {
53     int i,j;
54     cin>>n;
55     for(i=0;i<n;++i)
56         for(j=0;j<n;++j)
57         {
58             cin>>edge[j][i];
59             if(edge[j][i]==-1) edge[j][i]=INF;
60         }
61     int begin,temp,count=0;
62     cin>>begin;
63     begin--;
64     dijkstra(begin);
65     while(cin>>temp)
66     {
67         if(temp==-2) break;
68         points[count++].num=temp-1;
69     }    
70     for(i=0;i<count;++i)
71         points[i].len=dist[points[i].num];
72     sort(points,points+count,cmp);
73     int shortest[maxn];
74     cout<<"Org\tDest\tTime\tPath"<<endl;
75     for(i=0;i<count;++i)
76     {
77         cout<<points[i].num+1<<"\t"<<begin+1<<"\t"<<points[i].len;
78         memset(shortest,0,sizeof(shortest));
79         int k=0;
80         shortest[k]=points[i].num;
81 
82         while(path[shortest[k]]!=begin)
83         {
84             ++k;shortest[k]=path[shortest[k-1]];
85         }
86         k++;    shortest[k]=begin;
87         if(shortest[k]==shortest[0]) cout<<"\t"<<shortest[k]+1;
88         else
89         for(j=0;j<=k;j++)
90             cout<<"\t"<<shortest[j]+1;
91         cout<<endl;
92     }
93 
94     return 0;
95 
96 }
97         
98     

 

posted on 2012-10-29 17:09  symons  阅读(323)  评论(0编辑  收藏  举报