poj3268

本文介绍了一个基于Dijkstra算法实现的程序,该程序用于解决带权重的有向图中寻找两个顶点之间的最短路径问题。文章通过具体实例展示了如何初始化图结构、执行Dijkstra算法并获取最大最小路径长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 #include<cstdio>    
 #include<cstring>    
 #include<algorithm>  
 #include<iostream>    
 using namespace std;  
 const int INF=99999999;     
 int maps[2005][2005],v[2005],d[2005],d1[2005]; 
 int n, m, x; 
 int Dijkstra( )  
 {  
     int i,j,k,mini;  
     for(i=1;i<=n;i++) {
	 	d[i] = maps[i][x];
		d1[i] = maps[x][i];
	}        
     for(i=1;i<=n;i++)        
     {                                                   
        mini=INF;  
        k=-1;      
        for(j=1;j<=n;j++)      
        {  
            if(!v[j] && d[j]<mini)      
            {  
                k = j;  
                mini = d[k];  
            }  
        }  
        v[k]=1;  
            
        for(j=1;j<=n;j++)        
        {  
            if(!v[j] && d[k]+maps[j][k]<d[j])    //这里注意相当于从终点向起点找那么 此时便是相反的操作 maps[j][k]+d[k]操作为 反向判断点到集合是否满足条件  
            {   
                d[j]=d[k]+maps[j][k];  
            }  
        }     
    }  
    for(int i = 0; i <= n; i++) v[i] = 0;//反 
    
    for(i=1;i<=n;i++)        
     {                                                   
        mini=INF;  
        k=-1;      
        for(j=1;j<=n;j++)      
        {  
            if(!v[j] && d1[j]<mini)      
            {  
                k = j;  
                mini = d1[k];  
            }  
        }  
        v[k]=1;  
            
        for(j=1;j<=n;j++)        
        {  
            if(!v[j] && d1[k]+maps[k][j]<d1[j])       
            {   
                d1[j]=d1[k]+maps[k][j];  
            }  
        }     
    }
	int mi=-1;  
    for(i=1;i<=n;i++){  
        if(d[i]+d1[i]>mi)  
            mi=d[i]+d1[i];  
    }  
    return mi;  
 }  
   
 void init()  
 {  
    memset(v,0,sizeof(v)); //清除标记 
    for(int i=1;i<=n;i++)  
    {  
        for(int j=1;j<=n;j++)  
        {  
            maps[i][j]=INF;  
            maps[i][i]=0;//一定记得注意这里同一个点距离为0 
        }  
    }  
 }  
   
  int main()  
 {  
    //int x;
    while(scanf("%d%d%d", &n, &m, &x) != EOF){
    	init();
    	int len_max = -INF;
		//int len_max1 = -INF, len_max2 = -INF;
    	int node1, node2, len;
    	for(int i = 0; i < m; i++){
    		scanf("%d%d%d", &node1, &node2, &len);
			if(maps[node1][node2] > len){
				maps[node1][node2] = len;
			}    		
		}
		cout << Dijkstra() << endl;
		
	}
	
    return 0;  
 }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值