1063: 带权有向图计算
题目描述
假设带权有向图G采用邻接矩阵存储,计算图的最大权值、最小权值以及对应的有向边。
输入
第一行第一个整数n表示顶点的个数(顶点编号为0到n-1),第二行表示顶点i和j,接下来是为一个n*n大小的整数矩阵,表示图的邻接关系。数字为大于0表示邻接值,-1表示不邻接,对角线为0。
输出
第一行为最大权值,第二行为有向边。第三行为最小权值,第四行为有向边。
由于OJ无法显示尖括号,所以这里用圆扩号来表示有序对。
样例输入
5
0 5 -1 23 -1
-1 0 31 56 -1
-1 -1 0 -1 -1
-1 -1 -1 0 -1
56 -1 -1 19 0
样例输出
56
(1 3)(4 0)
5 (0 1)
注意:由于显示的问题,输出数据应采用尖括号。
思路:
1. 输入邻接矩阵
2. for循环找最大权值
3. 打印最大权值
4. for循环打印最大权值的两点
5. for循环找最小权值
6. 打印最小权值
7. for循环打印最大权值的两点
tips:关于权值最值问题的核心思想就是for循环
【拓展】最小值的初始即使再大也会有漏洞,因为你不能确定最小权值一定小于5815,但玄幻的OJ还是让我们过了,如果你想优化代码可以将min=5815删除然后使用下面注释掉的41-51行代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, a[100][100], max, min; //n为顶点的个数,max为最大权值,min为最小权值
cin >> n; //scanf("%d", &n);
for(int i=0;i<n;i++) //输入邻接矩阵
{
for(int j=0;j<n;j++)
{
cin >> a[i][j]; //scanf("%d", &a[i][j]);
}
}
max=0;
min=5815; //最小值的初始即使再大也会有漏洞,因为你不能确定最小权值一定小于5815,
for(int i=0;i<n;i++) //计算最大权值
{
for(int j=0;j<n;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
}
if(a[i][j]<min&&a[i][j]>0)
{
min=a[i][j];
}
}
}
cout << max <<endl; //printf("%d\n", max);
for(int i=0;i<n;i++) //输出最大权值的点
{
for(int j=0;j<n;j++)
{
if(a[i][j]==max)
{
cout << "<" << i <<" " <<j << ">";
}
}
}
//min=max;
// for(int i=0;i<n;i++) //计算最小权值
// {
// for(int j=0;j<n;j++)
// {
// if(a[i][j]<min&&a[i][j]>0)
// {
// min=a[i][j];
// }
// }
// }
cout <<endl << min <<endl; //printf("\n%d\n", min);
for(int i=0;i<n;i++) //输出最小权值的点
{
for(int j=0;j<n;j++)
{
if(a[i][j]==min)
{
cout << "<" << i <<" " <<j << ">";
}
}
}
return 0;
}
以上方法仅供参考,欢迎互联网的广大朋友们提出指正。