敢问路在何方
Time Limit:1000MS Memory Limit:65536K
Total Submit: Accepted:
Description
在ICPC网络赛进行的如火如荼之际,有一件事一直困扰着CCB。因为在ZQU,CCB所在的C栋公寓与计算机实验大楼分别位于学校对角的两个点,每次比完赛都得拖着疲惫的身躯,忍受着饥饿的煎熬回到C栋,一个月5场网络赛下来,那还得了?这段距离对于拥有庞大身躯的CCB来说,简直是折磨。所以CCB想知道,从C栋出发到实验楼,再从实验楼回到宿舍,最省时的路线是多久?
由于CCB得忙着研究算法,所以他将这个难题交给了你。为了帮助CCB脱离苦海,请帮他算出往返于C栋与实验楼的最短时间。
注意:由于ZQU位处北岭山下,路有上下坡之分,所以A~B的时间与B~A的时间不一定相同。
Input
本题有多个测试案例,每个案例第一行为n m。( 0 < n , m < 20 )
n表示为点的个数,点1为C栋公寓,点n为实验大楼。m表示路的数量。
接下来有m行,格式为x y t,x表示路的起点,y表示路的终点,t为从x到y得花时间t。(t < 100)
Output
每个案例,输出往返于C栋与实验大楼的最短时间。
Sample Input
2 2 1 2 13 2 1 33 4 6 1 2 10 2 1 60 1 3 20 3 4 10 2 4 5 4 1 50
Sample Output
46 65
Source
肇庆学院第二届校赛
#include<iostream>
using namespace std;
int map[25][25];//记录通路
int dis[25]; //存每次要比较的点
int n;
int used[25];
//两个函数分别是求1到n和n到1的最短路径的Dijkstra算法
int Dijkstra_went() //from NOCOW
{
int i,j,k;
for(i=1;i<=n;i++)
dis[i] = map[1][i];
for(i=1;i<n;i++)
{
int tmin = 0x1f1f1f1f;
for(j=1;j<=n;j++)
if( !used[j] && tmin > dis[j] )
{
tmin = dis[j];
k = j;
}
used[k] = 1;
for(j=1;j<=n;j++)
if( dis[k] + map[k][j] < dis[j] )
dis[j] = dis[k] + map[k][j];
}
// for(i=1;i<=n;i++)
// printf("%d ",dis[i]);
// printf("/n");
return dis[n];
}
int Dijkstra_back()
{
int i,j,k;
for(i=1;i<=n;i++)
dis[i] = map[n][i];
for(i=2;i<=n;i++)
{
int tmin = 0x1f1f1f1f;//intmax
for(j=1;j<=n;j++)
if( !used[j] && tmin > dis[j] )
{
tmin = dis[j];
k = j;
}
used[k] = 1;
for(j=1;j<=n;j++)
if( dis[k] + map[k][j] < dis[j] )
dis[j] = dis[k] + map[k][j];
}
// for(i=1;i<=n;i++)
// printf("%d ",dis[i]);
// printf("/n");
return dis[1];
}
int main()
{
int m;
int x,y,t;
int sum;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=0;
memset(map,0x1f1f1f1f,sizeof(map));
memset(dis,0,sizeof(dis));
memset(used,0,sizeof(used));
while(m--) //读入通路
{
scanf("%d%d%d",&x,&y,&t);
map[x][y]=t;
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// printf("%d ",map[i][j]);
// printf("/n");
// }
sum=Dijkstra_went();
memset(dis,0,sizeof(dis));
memset(used,0,sizeof(used));
sum+=Dijkstra_back();
printf("%d/n",sum);
}
return 0;
}