随笔 - 32  文章 - 2  trackbacks - 0
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用链接

留言簿(3)

随笔档案

文章档案

搜索

  •  

积分与排名

  • 积分 - 8797
  • 排名 - 1247

最新评论

阅读排行榜

评论排行榜

将线路和车站都抽象为结点,bfs计算最短路,注意有月票的人携带的钱看作无穷多
 1 #include <iostream>
 2 using namespace std;
 3 const int OO=2000000;
 4 int n,m,f;
 5 int link[300][300];
 6 int dis[300][300];
 7 int money[200],start[200];
 8 int reach[200][300];
 9 bool month[200];
10 int q[300][2],st,en;
11 bool v[300];
12 void bfs(int s){
13     int x=start[s];
14     for (int i=1;i<=m+n;++i) v[i]=false;
15     q[1][0]=x;
16     q[1][1]=0;
17     st=0; en=1;
18     v[x]=true;
19     reach[s][x]=0;
20     while(st<en){
21         ++st;
22         if (q[st][1]>money[s]) continue;
23         int nx=q[st][0];
24         for (int i=1;i<=link[nx][0];++i) if (!v[link[nx][i]]){
25             ++en;
26             q[en][0]=link[nx][i];
27             q[en][1]=q[st][1]+2;
28             if (q[en][1]>money[s]) break;
29             reach[s][link[nx][i]]=q[en][1];
30             v[link[nx][i]]=true;
31             }
32         }
33     }
34 int main(){
35     scanf("%d %d",&n,&m);
36     for (int i=1;i<=m;++i){
37         int l;
38         scanf("%d",&l);
39         for (int j=1;j<=l;++j){
40             int x;
41             scanf("%d",&x);
42             link[n+i][++link[n+i][0]]=x;
43             link[x][++link[x][0]]=n+i;
44             }
45         }
46     scanf("%d",&f);
47     for (int i=1;i<=f;++i){
48         int a,b,c;
49         scanf("%d %d %d",&a,&b,&c);
50         money[i]=a;
51         start[i]=b;
52         month[i]=c;
53         if (c==1) money[i]=OO;
54         }
55     for (int i=1;i<=f;++i)
56         for (int j=1;j<=m+n;++j) reach[i][j]=OO;
57     for (int i=1;i<=f;++i) bfs(i);
58     
59     int ans=OO,apos=0;
60     for (int i=1;i<=n;++i){
61         int sum=0;
62         for (int j=1;j<=f;++j){
63             if (month[j]==0)sum+=reach[j][i];
64             else if (reach[j][i]>=OO){
65                 sum=OO;
66                 break;
67                 }
68             }
69         if (sum<ans){
70             ans=sum;
71             apos=i;
72             }
73         }
74     if (apos==0) cout<<0;
75     else printf("%d %d",apos,ans);
76     }
77 

posted on 2008-11-09 17:27 Joseph 阅读(270) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理