⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 find the mincost route(最短路).cpp

📁 杭电acm解题报告2001---2099.
💻 CPP
字号:
//问题是求最小花费的环路(注意是环)
//枚举每条边<s,t>,先去掉<s,t>
//再value = Dijkstra(s,t)求出最短路
//判断<s,t> + value是否最小即可
#include <cstdio>
#include <string>

int matrix[110][110],path[110],n,m;          //matrix[][], 30000表示无限大,即无边.否则为有边,其值为边的权值
int Dijkstra(int x,int y)     //起点Vx 终点Vy
{
	int i,j,k,mark[110];
	int min,dist[110];   
	for(i=1;i<=n;i++) {
		mark[i] = 0;
		dist[i] = matrix[x][i];
		path[i] = x;
	}
	mark[x] = 1;     
	do {
		min=0xffffff;
		k=0;
		for(i=1;i<=n;i++)
			if(dist[i]!=-1 && mark[i]==0 && dist[i]<min) {
				min = dist[i];
				k = i;
			}
			if(k) {
				mark[k] = 1;
				for(i=1;i<=n;i++)
                    if(matrix[k][i]!=-1) {
						if(dist[i]==-1 || min+matrix[k][i]<dist[i]) {
							dist[i] = min + matrix[k][i];
							path[i] = k;
						}
                    }
			}
	}while(k);
	return dist[y];
}


int main()
{
	int ans;
	while (scanf("%d %d",&n,&m)==2) {
		memset(matrix,-1,sizeof(matrix));
		for (int i=0;i<m;i++) {
			int a,b,c;
			scanf("%d %d %d",&a,&b,&c);
			if (matrix[a][b] == -1 || matrix[a][b] > c) {
				matrix[a][b] = matrix[b][a] = c;
			}
		}
		ans = 0xffffff;
		for (i=1;i<=n;i++) {
			for (int j=i+1;j<=n;j++) {
				if (matrix[i][j]!=-1) {
					int pre = matrix[i][j];  
					matrix[i][j] = matrix[j][i] = -1;
					int v = Dijkstra(i,j);
					if (v != -1 && v + pre < ans) {
						ans = pre + v;
					}
					matrix[i][j] = matrix[j][i] = pre;
				}
			}
		}
		if (ans == 0xffffff) {
			printf("It's impossible.\n");
		}
		else {
			printf("%d\n",ans);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -