记录编号 |
131534 |
评测结果 |
AAA |
题目名称 |
[HAOI 2005]路由选择问题 |
最终得分 |
100 |
用户昵称 |
水中音 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.001 s |
提交时间 |
2014-10-24 17:00:44 |
内存使用 |
0.33 MiB |
显示代码纯文本
- #include<iostream>
- #include<cstdio>
- #include<queue>
- using namespace std;
- queue<int> A;
- bool pan[51]={0},qwq;
- int n,to[51][51]={0},street[51][51]={0},zui[51]={0},rezui[51][2]={0},cofr[51]={0},i,j,zj1,zj2,zj3,p,fr,en,s0,s1,s2;
- void init()
- {
- scanf("%d%d%d",&n,&fr,&en);
- for(i=1;i<=n;i++)
- for(p=1;p<=n;p++)
- {
- scanf("%d",&zj1);
- if(zj1)
- {
- to[i][0]++;
- to[i][ to[i][0] ]=p;
- street[i][p]=zj1;
- }
- }
- scanf("%d",&zj2);
- for(i=1;i<=zj2;i++)
- {
- scanf("%d",&zj1);
- pan[zj1]=true;
- }
- }
- void s0work()
- {
- for(i=1;i<=n;i++)zui[i]=0x7fffffff;
- zui[fr]=0;
- for(i=1;i<=to[fr][0];i++)
- if(!pan[ to[fr][i] ])
- {
- A.push(to[fr][i]);
- zui[ to[fr][i] ]=street[fr][ to[fr][i] ];
- }
- while(!A.empty())
- {
- zj1=A.front();A.pop();
- for(i=1;i<=to[zj1][0];i++)
- if(!pan[ to[zj1][i] ])
- {
- zj2=zui[zj1]+street[zj1][ to[zj1][i] ];
- if(zj2<zui[ to[zj1][i] ])
- {
- zui[ to[zj1][i] ]=zj2;
- A.push(to[zj1][i]);
- }
- }
- }
- s0=zui[en];
- }
- void s1ands2work()
- {
- for(i=1;i<=n;i++)rezui[i][0]=rezui[i][1]=1000000;
- rezui[fr][1]=0;
- A.push(fr);
- while(!A.empty())
- {
- zj1=A.front();A.pop();
- for(i=1;i<=to[zj1][0];i++)
- {
- qwq=false;
- zj2=rezui[zj1][1]+street[zj1][ to[zj1][i] ];
- zj3=rezui[zj1][0]+street[zj1][ to[zj1][i] ];
- if(zj2<rezui[ to[zj1][i] ][1])
- {
- rezui[ to[zj1][i] ][0]=rezui[ to[zj1][i] ][1];//更新第二小的值
- rezui[ to[zj1][i] ][1]=zj2;//更新最小值
- cofr[ to[zj1][i] ]=zj1;//记录转移点
- if(zj3<rezui[ to[zj1][i] ][0]) rezui[ to[zj1][i] ][0]=zj3;
- qwq=true;
- }
- else//第二小的更新
- if(zj2<rezui[ to[zj1][i] ][0]&&cofr[ to[zj1][i] ]!=zj1)
- {
- rezui[ to[zj1][i] ][0]=zj2;
- qwq=true;
- }
- if(qwq)//假如更新过,则此点入队
- A.push(to[zj1][i]);
- }
- }
- s1=rezui[en][1];
- s2=rezui[en][0];
- }
- int main()
- {
- freopen("route.in","r",stdin);
- freopen("route.out","w",stdout);
- init();
- s0work();
- s1ands2work();
- printf("%d %d %d\n",s0,s1,s2);
- return 0;
- }