hdu2923 Einbahnstrasse map+floyd最短路

来源:互联网 发布:大图打印 软件 编辑:程序博客网 时间:2024/06/05 06:13

题意啊,题意很重要!!N<100 而C<1000

第一个名字是拖车公司,后面的c个是破车的地方,所以有可能出现几个破车在同一个地方的。

而拖车一次只能拖一辆,所以要用一个数组记录下每个破车的位置。

就因为这,RE了我N次!

建图过程也挺麻烦,主要是字符串的处理

#include<cstdio>#include<iostream>#include<string>#include<map>#include<cstring>using namespace std;map<string,int> m;int main(){    int i,j,n,broke,k,ans,cases=1;    int map[110][110];    int dis[110][110];    int c,r;    int id=1;int q[1010];    string s,s1,s2,s3;    while(scanf("%d%d%d",&n,&c,&r)!=EOF)    {        m.clear();        broke=c;        id=1;        if(n==0&&c==0&&r==0) break;        memset(dis,0x3f,sizeof(dis));        memset(map,0x3f,sizeof(map));        for(i=1;i<=c+1;i++)        {            cin>>s;            if(m[s]==0) m[s]=id++;int t=m[s];q[i]=t;//记录破车;        }        for(i=1;i<=r;i++)        {            int a=0,b=0,sum=0;            cin>>s1>>s2>>s3;            if(m[s1]==0)                m[s1]=id++;            if(m[s3]==0)                m[s3]=id++;        //    cout<<"\nm["<<s3<<"]="<<m[s3]<<" \n";            a=m[s1];            b=m[s3];            for(j=2;s2[j]!='-';j++)            {                sum=sum*10+s2[j]-'0';            }            if(s2[0]=='<')            {                if(sum<map[b][a])            map[b][a]=sum;            }            if(s2[s2.length()-1]=='>')             {                if(sum<map[a][b])            map[a][b]=sum;            }        }//floyd算法        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)            {                dis[i][j]=map[i][j];                dis[i][i]=0;            }        for(k=1;k<=n;k++)            for(i=1;i<=n;i++)                for(j=1;j<=n;j++)                    dis[i][j]=dis[i][j]>dis[i][k]+dis[k][j]?dis[i][k]+dis[k][j]:dis[i][j];                ans=0;        for(i=2;i<=broke+1;i++)            ans+=dis[1][q[i]]+dis[q[i]][1];        printf("%d. %d\n",cases++,ans);    }    return 0;}


原创粉丝点击