1 条题解

  • 0
    @ 2025-4-7 21:19:28

    C :

    #include<stdio.h>
    
    struct GRAPH
    {
    	int len;
    	int cost;
    };
    
    struct GRAPH g[1010][1010];
    
    int main()
    {
    	int n,m;
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		if(m==0&&n==0)
    		{
    			break;
    		}
    		//初始化邻接矩阵
    		for(int i=1;i<=n;i++)
    		{
    			for(int j=1;j<=n;j++)
    			{
    				g[i][j].len=-1;//-1不可达
    				g[i][j].cost=-1;
    			}
    			g[i][i].len=0;
    			g[i][i].cost=0;
    		}
    		//输入每条边的信息
    		
    		for(int i=1;i<=m;i++)
    		{   
    			int a,b; 
    			scanf("%d%d",&a,&b);
    			scanf("%d%d",&g[a][b].len,&g[a][b].cost);
    			g[b][a].len=g[a][b].len;//无向图 复制两次
    			g[b][a].cost=g[a][b].cost;
    		}
    		//Floyed
    		for(int k=1;k<=n;k++)
    		{
    			for(int i=1;i<=n;i++)
    			{
    				for(int j=1;j<=n;j++)
    				{
    					if((g[i][k].len==-1)||(-1==g[k][j].len))
    						continue;//保持不动,跳出循环
    					if(((g[i][k].len+g[k][j].len)<g[i][j].len)||(((g[i][k].len+g[k][j].len)==g[i][j].len)&&((g[i][k].cost+g[k][j].cost)<g[i][j].cost))||(g[i][j].len==-1))//最后一个不能漏
    					{
    						g[i][j].len=g[i][k].len+g[k][j].len;
    						g[i][j].cost=g[i][k].cost+g[k][j].cost;
    					}
    				}
    			}
    		}
    		//接受起点终点
    		int s,e;
    		scanf("%d%d",&s,&e);
    		printf("%d %d\n",g[s][e].len,g[s][e].cost);
    	}
    	return 0;
    }
    

    C++ :

    #include <stdio.h>
    #include <string.h>
    
    #define MAXSIZE 1100		// 最大节点数
    int minDis, minCost;		// 最小距离和最小花费
    int info[MAXSIZE][MAXSIZE][2];	// 记录两点之间的距离和花费
    bool visited[MAXSIZE];		// 记录是否遍历过了,防止形成回路造成无限循环
    int nodeE;					// 记录终点
    int numOfNodes;				// 节点总数
    
    void DFS(int curNode, int curDis, int curCost){
    	if(curDis>minDis || (curDis==minDis && curCost>minCost)){	// 如果当前的距离大于最小距离或者当前花费大于最小花费,没必要继续搜索了
    		return ;
    	}
    
    	if(curNode == nodeE){		// 如果到达终点了,则记录最小距离和最小花费
    		minDis = curDis;
    		minCost = curCost;
    		return ;
    	}
    
    	int i;
    	for(i=1; i<=numOfNodes; i++){
    		if(!visited[i] && info[curNode][i][0]){		// 如果和当前节点连接的另一个节点没有遍历过则遍历之
    			visited[i] = true;						// 标记成已经遍历过
    			DFS(i, curDis+info[curNode][i][0], curCost+info[curNode][i][1]);	// 遍历相邻节点
    			visited[i] = false;						// 回溯回来时撤销标记
    		}
    	}
    }
    
    int main(){
    
    	int lines;						// 记录行数
    	int nodeA, nodeB, dis, cost;	// 记录数据
    	int nodeS;						// 记录起始点
    	while(scanf("%d%d", &numOfNodes, &lines), numOfNodes||lines){
    		int i;
    		memset(info, 0, sizeof(info));				// 将各节点信息清空
    		memset(visited, 0, sizeof(visited));		// 将访问过的标记清空
    		for(i=0; i<lines; i++){		// 读入各节点的信息,哪两个节点之间有通路、长度以及花费是多少
    			scanf("%d%d%d%d", &nodeA, &nodeB, &dis, &cost);
    			info[nodeA][nodeB][0] = dis;
    			info[nodeA][nodeB][1] = cost;
    			info[nodeB][nodeA][0] = dis;
    			info[nodeB][nodeA][1] = cost;
    		}
    		scanf("%d%d", &nodeS, &nodeE);	// 读入起点和终点序号
    		visited[nodeS] = true;			// 将起点设置为遍历过了
    		minDis = 0x7FFFFFFF;			// 最小路径开始时设置为最大,这样在以后的搜索中逐渐减小
    		minCost = 0x7FFFFFFF;			// 最小花费与最小路径是相似的
    		DFS(nodeS, 0, 0);				// 通过深度优先搜索来找寻最短路劲以及最小花费
    		printf("%d %d\n", minDis, minCost);	// 输出结果
    	}
    
    	return 0;
    }
    
    
    • 1

    信息

    ID
    1150
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者