HDU 2923 Einbahnstrasse

来源:互联网 发布:淘宝店铺的图片 编辑:程序博客网 时间:2024/05/18 17:41


最短路

有容易错的地方

1.拉一辆车要回一趟公司

2.车可能本来就在公司,也可能很多辆车放在一个地方,所以读入的时候也要判断这个地点是否已经存在

3.要注意<对应的方向,不过弄反了也没有关系吧, 反正要一来一回的


#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#define N 1005#include<map>#define INF 1<<29using namespace std;int n,m[N][N],q[N];map<string ,int> M;void Floyd(){    int i,j,k;    for(k=1;k<=n;k++)    for(i=1;i<=n;i++){        for(j=1;j<=n;j++){            m[i][j]=min(m[i][j],m[i][k]+m[k][j]);        }    }}int main(){    string str,str1,str2;    int ics=0,l,x,y,c,r,i,j,t,tmp,cnt;    while(~scanf("%d%d%d",&n,&c,&r)){        if(!n&&!c&&!r)        break;        cnt=1;x=0;t=0;        M.clear();        c++;        while(c--){            cin>>str;            if(M[str]==0)            M[str]=cnt++;            q[t++]=M[str];        }        for(i=1;i<=n;i++){            for(j=1;j<=n;j++){                m[i][j]=INF;                if(i==j)                m[i][j]=0;            }        }        while(r--){            cin>>str1>>str>>str2;            if(M.find(str1)==M.end())            M[str1]=cnt++;            if(M.find(str2)==M.end())            M[str2]=cnt++;            x=M[str1],y=M[str2];            l=str.size();            tmp=0;            i=0;            while(!isdigit(str[i]))            i++;            while(isdigit(str[i]))            tmp=tmp*10+str[i]-'0',i++;            if(str[0]=='<')            m[y][x]=min(m[y][x],tmp);            if(str[l-1]=='>')            m[x][y]=min(m[x][y],tmp);        }        Floyd();        int ans=0;        for(i=0;i<t;i++){            ans+=m[1][q[i]];            ans+=m[q[i]][1];        }        printf("%d. %d\n",++ics,ans);    }    return 0;}


0 0
原创粉丝点击