題目:
4 2 5NewTroy Midvale MetrodaleNewTroy <-20-> MidvaleMidvale --50-> BakerlineNewTroy <-5-- BakerlineMetrodale <-30-> NewTroyMetrodale --5-> Bakerline0 0 0 Sample Output1. 804個城市 2輛破車 5條路
收破車的公司在NewTroy 兩輛破車分別在Midvale Metrodale
接下來為5條路 有單向也有雙向
求回收所有破車的最小來回代價
思路:用Floyd,注意輸入處理,將字符串映射為數字
代碼:
#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<ctype.h> //tower()#include<set> #include<map> #include<iomanip>// cout<<setprecision(1)<<fixed<<a;#include<vector> #include<cmath> #include<algorithm>#include<bitset>#include<limits.h>#include<stack>#include<queue>using namespace std;const int maxn=10000010;const int inf=0x3f3f3f3f;int n,c,m,a[105][105];char save[1005][11];map<string,int> mat;void Floyd(){ int i,j,k; for(i = 1;i<=n;i++) for(j = 1;j<=n;j++) for(k = 1;k<=n;k++) if(a[j][i]+a[i][k]<a[j][k]) a[j][k] = a[j][i]+a[i][k];}int main(){//124MS 1680K int val,cnt,sum,cas = 1; char s1[11],s2[11],s3[11]; char from,to; while(scanf("%d%d%d",&n,&c,&m)==3&&(n+c+m)){ sum = 0; mat.clear(); memset(a,inf,sizeof(a)); for(int i = 0; i<=c; i++) scanf("%s",save[i]); cnt = 1; for(int i = 0; i<m; i++){ scanf("%s %c-%d-%c %s",s1,&from,&val,&to,s3); if(!mat[s1]) mat[s1] = cnt++; if(!mat[s3]) mat[s3] = cnt++; int x = mat[s1],y = mat[s3]; if(from == '<' && val<a[y][x]) a[y][x] = val;//輸入可能有重邊 if(to == '>' && val<a[x][y]) a[x][y] = val; } Floyd(); for(int i = 1; i<=c; i++) sum+=a[mat[save[0]]][mat[save[i]]]+a[mat[save[i]]][mat[save[0]]]; printf("%d. %d/n",cas++,sum); } return 0;}
新聞熱點
疑難解答