1195: V8与女友
时间限制: 1 Sec 内存限制: 128 MB
提交: 1244 解决: 257
[提交][状态][讨论版]
题目描述
那是遥远的公元前2333年,V8还有女朋友的时代。
他和他的女友分别是两个距离遥远的部落的首领,那时候没有现在发达的交通工具和路网,V8每次希望团圆的时候,都要跋山涉水不远万里去会见他的爱人,辛酸的很。经过很多次的旅途,V8掌握了他可以走的所有的路的路线图,毕竟作为首领,不能离开自己的领地太久,所以V8希望你给他找出一条最近的路,并且输出一次往返所需要的最短时间,V8并不会在对方领地停留,说个你好就回来了,需要的时间为0。
虽然不管你求出来有多快,最终V8还是觉得自己在路上花费的时间太多,选择了舍小家而为大家(手动滑稽。
输入
第一行一个正整数t,表示数据的组数(t <=10)。
之后对于每组数据,第一行一个正整数k,表示这个地图(无向图)的路径数(k<=10000)。
之后有k行,每一行三个正整数,s,t,v。表示路的两个端点和这条路需要的时间(s,t,v <=100)。
第k+1行为两个数,v,m,表示V8和他爱人的所在地。
输出
对于每组数据,输出一行一个正整数,为V8一个来回最短的时间(数据保证有通路)。
样例输入
1
4
1 2 1
1 3 1
2 4 2
3 4 1
1 4
样例输出
4
提示
来源
fpc
#include<stdio.h>
#include<math.h>
#include<string.h>
#define max(a,b) (a>b)? b:a
#define MAX 101
#define INF 1000000000
int dijkstra (int mat[][MAX],int n, int s,int f)
{//s为起点, f:为终点
int dis[MAX];//记录到任意点的最短距离
int mark[MAX];//记录被选中的结点
int i,j,k = 0;
for(i = 0 ; i < n ; i++)//初始化所有结点,每个结点都没有被选中
mark[i] = 0;
for(i = 0 ; i < n ; i++)//将每个结点到start结点weight记录为当前distance
{
dis[i] = mat[s][i];
//path[i] = s;
}
mark[s] = 1;//start结点被选中
//path[s] = 0;
dis[s] = 0;//将start结点的的距离设置为0
int min ;//设置最短的距离。
for(i = 1 ; i < n; i++)
{
min = INF;
for(j = 0 ; j < n;j++)
{
if(mark[j] == 0 && dis[j] < min)//未被选中的结点中,距离最短的被选中
{
min = dis[j] ;
k = j;
}
}
mark[k] = 1;//标记为被选中
for(j = 0 ; j < n ; j++)
{
if( mark[j] == 0 && (dis[j] > (dis[k] + mat[k][j])))//修改剩余结点的最短距离
{
dis[j] = dis[k] + mat[k][j];
}
}
}
return dis[f];
}
int mat[MAX][MAX];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n=MAX,m;
scanf("%d",&m); //n是节点个数
int a,b,dis;
if(m == 0)
break;
int i,j;
for(i = 0 ; i < MAX;i++)
for(j = 0 ; j < MAX; j++)
mat[i][j] = INF;
for(i = 0 ; i < m ;i++) //接受m行数据
{
scanf("%d %d %d",&a,&b,&dis);
--a,--b;
if(dis < mat[a][b] || dis < mat[b][a])
mat[a][b] = mat[b][a] = dis;
}
int s,t;
scanf("%d %d",&s,&t);
s--;t--;
int ans = dijkstra(mat,n,s,t);
ans=2*ans;
printf("%d\n",ans);
}
return 0;
}