xdoj 1195: V8与女友

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;  
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值