hdu3499 分层图

#include<bits/stdc++.h>
using namespace std;
#define rd(x) scanf("%d",&x)
#define rdd(x,y) scanf("%d%d",&x,&y)
#define rddd(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define rds(s) scanf("%s",s)
#define rep(i,n) for(int i=0;i<n;i++)
#define LL long long
const int N = 1e5+10;
const int M=5e5+10;
const long long inf=1e15;
const int MOD=1e9+7;
int n,m,k;
int t;
int tot;
int head[N*2];
struct Edge{
    int to,nxt,w;
}edge[M*6];
void addEdge(int u,int v,int w){
    edge[tot].to=v;
    edge[tot].w=w;
    edge[tot].nxt=head[u];
    head[u]=tot++;
}
map<string,int> mapp;
LL dis[N*2];
bool vis[N*2];
queue<int> que;
LL ans;
void solve(int s,int e){
    ans=inf;
    memset(vis,0,sizeof vis);
    for(int i=1;i<=n*2;i++) dis[i]=inf;
    dis[s]=0;
    while(!que.empty()) que.pop();
    que.push(s);vis[s]=1;
    while(!que.empty()){
        int u=que.front();que.pop();vis[u]=0;
        if(u==e) {
            if(dis[u]<ans) ans=dis[u];
            continue;
        }
        for(int k=head[u];~k;k=edge[k].nxt){
            int v=edge[k].to,w=edge[k].w;
            if(w+dis[u]<dis[v]) {
                dis[v]=dis[u]+w;
                if(!vis[v]){
                que.push(v);
                vis[v]=1;
            }
            }

        }
    }
    if(dis[e]<inf) printf("%I64d\n",dis[e]);
    else puts("-1");
}
int main()
{
#ifndef ONLINE_JUDGE
  freopen("aaa","r",stdin);
#endif
    int T,q;
    string s3,s4;
    char s1[20],s2[20];
    int w;
    while(~scanf("%d%d",&n,&m)){
            mapp.clear();t=0;
            memset(head,-1,sizeof head);
            tot=0;
            rep(i,m){
                scanf("%s %s %d",s1,s2,&w);s3=s1;s4=s2;
                if(mapp.find(s3)==mapp.end()) mapp[s3]=++t;
                if(mapp.find(s4)==mapp.end()) mapp[s4]=++t;
                int u=mapp[s3],v=mapp[s4];
                addEdge(u,v,w);
                addEdge(u,v+n,w/2);
                addEdge(u+n,v+n,w);
            }
            scanf("%s%s",s1,s2);s3=s1;s4=s2;
            int s=-1,e=-1;
            if(mapp.find(s3)!=mapp.end()) s=mapp[s3];
            if(mapp.find(s4)!=mapp.end()) e=mapp[s4];
            if(s==-1 || e==-1) puts("-1");
            else{
               if(s==e){
               puts("0");
               }else
                    solve(s,e+n);
                }
    }
    return 0;
}

你可能感兴趣的:(hdu3499 分层图)