杭电2923————Folyd

题目链接:点击打开链接

这个题目其实很简单,就是各种坑。

1.同一个地方破车可能有多辆。

2.每次拖完一辆破车必须回来,不能全部一次性拖完所有的....//一开始题意弄错了在这个地方纠结了很久

3.因为城市是用字符串的形式存储的,所以需要自己定义一个映射,当然c++用map也可以。

以上这些处理完之后,跑一边Floyd就可以了。网上看题解有跑两边Dijkstra的,这样会快很多。

没有用map,62ms

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define maxn 105
#define INF 0x7ffffff
using namespace std;

int cases = 0;
int cnt = 0;
int N,C,R;
int G[maxn][maxn];
char city[maxn][20];
char car[1005][20];

int Min(int x,int y)
{
    return (x < y) ? x : y;
}
void init()
{
    cnt = 0 ;
    for(int i = 0 ; i < maxn ; ++i)
        for(int j = 0 ; j < maxn ; ++j)
            G[i][j] = INF;
    memset(city,0,sizeof(city));
    memset(car,0,sizeof(car));
}
int FindCity(char *s)
{
    for(int i = 0 ; i < cnt ; ++i)
        if(strcmp(city[i],s) == 0)
            return i;
    //如果没有找到的话
    return -1;
}
int main()
{
    char temp[maxn] = {0},temp1[maxn] = {0},temp2[maxn] = {0};
    char from,to;
    int value;

    while(cin >> N >> C >> R){
        if(N == 0 && C == 0 && R == 0)
            break;
        init();
        for(int i = 0 ; i <= C ; ++i){//C+1
            cin >> temp;
            strcpy(car[i],temp);//破车
            if(FindCity(temp) == -1)
                strcpy(city[cnt++],temp);
        }
        while(R--){
            scanf("%s %c-%d-%c %s",temp1,&from,&value,&to,temp2);
            int v1 = FindCity(temp1);
            int v2 = FindCity(temp2);
            if(v1 == -1){
                strcpy(city[cnt++],temp1);
                v1 = cnt-1;
            }
            if(v2 == -1){
                strcpy(city[cnt++],temp2);
                v2 = cnt -1;
            }
            if(from == '<')
                G[v2][v1] = Min(G[v2][v1],value);
            if(to == '>')
                G[v1][v2] = Min(G[v1][v2],value);
        }
        //Floyd
        for(int k = 0 ; k < N ; ++k)
            for(int i = 0 ; i < N ; ++i)
                for(int j = 0 ; j < N ; ++j)
                    G[i][j] = Min(G[i][j],G[i][k]+G[k][j]);
        //可能有多辆破车
        int sum = 0;
        for(int i = 1 ; i <= C ; ++i){
            int v = FindCity(car[i]);
            sum += G[0][v] + G[v][0];
        }
        printf("%d. %d\n",++cases,sum);
    }
    return 0;
}


用了map,156ms,转自:点击打开链接

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
#define inf 999999999
const int L = 1005;
int n,c,m;
int a[105][105];
char str[1005][100];
int cnt;
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()
{
    int i,j,val,x,y,len,cas = 1,sum,start;
    char s1[100],s2[100],s3[100];
    char from,to;
    while(~scanf("%d%d%d",&n,&c,&m)&&(n+c+m))
    {
        sum = 0;
        mat.clear();
        for(i = 0; i<=n; i++)
            for(j = 0; j<=n; j++)
                a[i][j] = inf;
        for(i = 0; i<=c; i++)
            scanf("%s",str[i]);
        cnt = 1;
        for(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++;
            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();
        start = mat[str[0]];
        for(i = 1; i<=c; i++)
            sum+=a[start][mat[str[i]]]+a[mat[str[i]]][start];
        printf("%d. %d\n",cas++,sum);
    }

    return 0;
}



 

转载于:https://www.cnblogs.com/sixdaycoder/p/4348350.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值