hdu 2923

最短路加字符串处理

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <map>
using namespace std;
#define N 2005
#define INF 0x3f3f3f3f
#define LL __int64
#define INF 0x3f3f3f3f
char s1[20],s2[20],s3[20],s[1005][20];
int ma[N][N],d[N],vis[N];
void flody(int n)
{
    int i , j, k;
    for(k = 1 ; k <= n ; k++)
    {
        for(i = 1 ; i <= n ; i++)
        {
            if(ma[i][k]!=INF)
            {
                for(j = 1 ; j<=n ; j++)
                if(ma[i][k]+ma[k][j]<ma[i][j]) ma[i][j] = ma[i][k]+ma[k][j];
            }
        }
    }
}
int main()
{
    int n,i,j,k,c,r,num ,cas = 1;
    map<string,int>m;
    while(~scanf("%d %d %d",&n,&c,&r),n+c+r)
    {
        num = 1;

        m.clear();
        for(i = 1 ; i <= c+1;i++)
        {
            scanf("%s",s[i]);
            if(!m[s[i]])
            m[s[i]] = num++;
        }
        for(i = 1; i<= N ;i++)
            for(j = 1; j<= N ;j++)
            ma[i][j] = (i==j)?0:INF;
        for(i = 1; i<= r ; i++)
        {
            scanf("%s %s %s",s1,s2,s3);
            int ans = 0,len2 = strlen(s2),x,y;
            for(j = 0 ; j < len2 ; j++)
                if(s2[j]>='0'&&s2[j]<='9') ans = ans*10+s2[j] - '0';
                if(!m[s1]) m[s1] = num++;
                if(!m[s3]) m[s3] = num++;
                x = m[s1];
                y = m[s3];
            if(s2[0]=='<'&&s2[len2-1]=='>'){
                if(ma[x][y]>ans)
                    ma[x][y]  = ans;
                if(ma[y][x]>ans) ma[y][x] = ans;
            }else if(s2[0]=='<'){
                if(ma[y][x]>ans)
            ma[y][x] = ans;
            }else if(ma[x][y]>ans) ma[x][y] = ans;
        }
            flody(num);
            int sum = 0,p;
            for(i = 2 ; i <=c+1;i++)
                sum+=ma[m[s[i]]][1]+ma[1][m[s[i]]];
            printf("%d. %d
",cas++,sum);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/llei1573/p/3912914.html