题目:求各城市每条给定起点和终点间通路的最小负载,并据此求出所有最小负载中的最大值,无需考虑路程问题。
方法:用的floyd算完了之后去网上查发现用dijstra做- -
哭了- -
去补dijstra- -
恶心的是把字符串映射到int里、用的vector
#include <fstream>
#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn= 205;
int n,r,t;
char str1[35],str2[35];
int map[maxn][maxn];
struct city
{
int id;
char name[35];
}; //许多城市
vector <city> v;
int search_name(char *p) //恶心的找名字- - 把找名字和更新数组放一起了
{
for(int i=0;i<v.size();i++)
{
if(strcmp(v[i].name,p)==0)
return v[i].id;
}
city temp;
temp.id=v.size();
strcpy(temp.name,p);
v.push_back(temp);
return temp.id;
}
void floyd(int s,int e) //万能的floyd 但总感觉在这里用的不太对劲- -
{
int num=v.size();
for(int k=0;k<num;k++)
for(int i=0;i<num;i++)
for(int j=0;j<num;j++)
{
if(map[i][j]<map[i][k]&&map[i][j]<map[k][j])
map[j][i]=map[i][j]=map[i][k]<map[k][j]?map[i][k]:map[k][j];
//如果有大路径,则取大路径里的小的那个
}
printf("%d tons\n\n",map[s][e] );
}
int main()
{
//freopen("input.txt","r",stdin);
int kase=0;
while(cin>>n>>r,n)
{
kase++;
memset(map,0,sizeof(map)); //要定义为0
//for(int i=0;i<n;i++)
//map[i][i]=0;
v.clear();
for(int i=0;i<r;i++){
scanf("%s %s %d",str1,str2,&t);
int id1=search_name(str1);//printf("%d\n",id1 );
int id2=search_name(str2);
map[id1][id2]=map[id2][id1]=t;
}
char st[35],ed[35];
scanf("%s %s",st,ed);
printf("Scenario #%d\n",kase);
floyd(search_name(st),search_name(ed));
}
return 0;
}