选拔
#include<cstdio>
#include<iostream>
#include <vector>
using namespace std;
#define MAX 500
#define INFE 1<<20
int N;
double map[MAX][MAX],b[MAX];
int path[MAX][MAX]; //path[i][j]记录路径
void init()
{
int i,j;
for(i=1; i<=N; i++)
for(j=1; j<=N; j++)
{
map[i][j]=INFE;
path[i][j]=j;
}
}
void floyd()
{
int i,j,k;
for(k=1; k<=N; k++)
for(i=1; i<=N; i++)
for(j=1; j<=N; j++)
if(map[i][j]>map[i][k]+map[k][j])
{
map[i][j]=map[i][k]+map[k][j];
path[i][j]=path[i][k];
}
}
double shortest[MAX];
int main()
{
int m,u,v;
double len;
int n;
freopen("data.txt","r",stdin);
scanf("%d%d",&N,&m); //输入城市数量 和 道路数量
n = N;
init();//初始化
while(m--)
{
scanf("%d%d%lf",&u,&v,&len);
map[u][v]=map[v][u]=len;
}
floyd();//进行每对节点的求最小路径
double res = INFE;
vector<int>ans;
for(int i=1;i<=n;i++){
double du = 0;
for(int j=1;j<=n;j++){
if(i == j) continue;
du += map[i][j];
}
if(du < res){
ans.clear();
ans.push_back(i);
res = du;
}
else if(du == res){
ans.push_back(i);
}
}
cout<<"The shorest paths is "<< res<<endl;
cout<<"the number of the start "<< ans.size()<<endl;
for(int i=0;i<ans.size();i++){
cout<<"answer"<<i+1<<" "<<ans[i]<<endl;
}
return 0;
}
#include<cstdio>
#include<iostream>
#include <set>
using namespace std;
#define MAX 500
#define INFE 1<<20
int N;
double map[MAX][MAX],b[MAX];
int path[MAX][MAX]; //path[i][j]记录路径
void init()
{
int i,j;
for(i=1; i<=N; i++)
for(j=1; j<=N; j++)
{
map[i][j]=INFE;
path[i][j]=j;
}
}
void floyd()
{
int i,j,k;
for(k=1; k<=N; k++)
for(i=1; i<=N; i++)
for(j=1; j<=N; j++)
if(map[i][j]>map[i][k]+map[k][j])
{
map[i][j]=map[i][k]+map[k][j];
path[i][j]=path[i][k];
}
}
double shortest[MAX];
int main()
{
int m,u,v;
double len;
int n;
freopen("data.txt","r",stdin);
scanf("%d%d",&N,&m); //输入城市数量 和 道路数量
n = N;
init();//初始化
while(m--)
{
scanf("%d%d%lf",&u,&v,&len);
map[u][v]=map[v][u]=len;
}
floyd();//进行每对节点的求最小路径
//cout<<"finish"<<endl;
// for(int i=1;i<=n;i++)
// for(int j=1;j<=n && j!=i;j++)
// {
// //输入起点和终点
// int tmp=u;
// printf("%d",u);
// while(tmp!=v)
// {
// //打印路径
// printf("-->%d",path[tmp][v]);
// tmp=path[tmp][v];
// }
// //输出最小花费
// cout<<endl;
// cout<<"cost: "<<map[u][v]<<endl;
// }
set<pair<int,int> > s;
double res = INFE;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
//cout<<i<<" "<<j<<endl;
double du = 0;
for(int k = 1;k<=n;k++){
if(k == i || k == j) continue;
du += min(map[i][k],map[j][k]);
}
int u,v;
u = i;
v = j;
if(res > du){
s.clear();
if(i>j) swap(u,v);
s.insert(make_pair(u,v));
res = du;
}
else if(res == du){
if(i > j) swap(u,v);
s.insert(make_pair(u,v));
}
}
}
cout<<"The shorest paths is "<< res<<endl;
cout<<"the number of the start "<< s.size()<<endl;
set<pair<int,int> >::iterator it;
int cnt = 0;
for(it = s.begin();it!=s.end();it++){
cout<<"answer"<<cnt+1<<" "<<(it->first) <<" "<<(it->second)<<endl;
}
return 0;
}
#include<cstdio>
#include<iostream>
#include <set>
using namespace std;
#define MAX 500
#define INFE 1<<20
int N;
double map[MAX][MAX],b[MAX];
int path[MAX][MAX]; //path[i][j]记录路径
void init()
{
int i,j;
for(i=1; i<=N; i++)
for(j=1; j<=N; j++)
{
map[i][j]=INFE;
path[i][j]=j;
}
}
void floyd()
{
int i,j,k;
for(k=1; k<=N; k++)
for(i=1; i<=N; i++)
for(j=1; j<=N; j++)
if(map[i][j]>map[i][k]+map[k][j])
{
map[i][j]=map[i][k]+map[k][j];
path[i][j]=path[i][k];
}
}
double shortest[MAX];
int main()
{
int m,u,v;
double len;
int n;
freopen("data.txt","r",stdin);
scanf("%d%d",&N,&m); //输入城市数量 和 道路数量
n = N;
init();//初始化
while(m--)
{
scanf("%d%d%lf",&u,&v,&len);
map[u][v]=map[v][u]=len;
}
floyd();//进行每对节点的求最小路径
set<pair<int,pair<int,int> > > s;
double res = INFE;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
for(int h = 1; h<=n; h++)
{
double du = 0;
for(int k = 1; k<=n; k++)
{
if(k == i || k == j || k == h) continue;
du += min(map[i][k],min(map[j][k],map[h][k]));
}
int u,v,w;
u = i;
v = j;
w = h;
if(res > du)
{
s.clear();
u = max(i,max(j,h));
v = min(i,min(j,h));
w = i+j+h-u-v;
s.insert(make_pair(u,make_pair(v,w)));
res = du;
}
else if(res == du)
{
if(i > j) swap(u,v);
u = max(i,max(j,h));
v = min(i,min(j,h));
w = i+j+h-u-v;
s.insert(make_pair(u,make_pair(v,w)));
}
}
}
}
cout<<"The shorest paths is "<< res<<endl;
cout<<"the number of the start "<< s.size()<<endl;
set<pair<int,pair<int,int> > >::iterator it;
int cnt = 0;
for(it = s.begin(); it!=s.end(); it++)
{
cout<<"answer"<<cnt+1<<" "<<(it->first) <<" "<<((it->second).first)<<" "<<((it->second).second)<<endl;
}
return 0;
}