HDU 2923 Einbahnstrasse

英语渣就是这点不好。。。

巨恶心这种描述多的题。。

大意就是求 从一个点出发,到某些点,然后又从那些点返回的距离之和的 最小值。

Dijkstra+邻接矩阵。 正向建图,求出出发距离,然后swap边,求出 返回距离。

注意的是 车可能有重复的。某个点有多少车就需要乘以车的数量。

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
using namespace std;
int n,m;
int g[101][101];
map<string,int>str;
int d[101];
void Dijkstra(int start,int *dis)
{
    bool vis[101];
    for(int i=1;i<=n;i++)
        dis[i]=INF,vis[i]=0;
    vis[start]=1,dis[start]=0;
    for(int i=1;i<n;i++)
    {
        int mi=INF,k=start;
        for(int j=1;j<=n;j++)
            if(dis[j]<mi&&!vis[j])mi=dis[j],k=j;
        vis[k]=1;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]>dis[k]+g[k][j]&&g[k][j]<INF)
                dis[j]=dis[k]+g[k][j];
        }
    }
}
int main()
{
    int cot=1,top;
    while(scanf("%d%d%d",&n,&top,&m),n||top||m)
    {
        str.clear();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            g[i][j]=INF;
        int dis1[101],dis2[101];
        int car[101];
        memset(car,0,sizeof(car));
        string a,b,c;
        int start,num=1;

        cin>>a;
        if(str[a]==0)str[a]=num++;
        start=str[a];

        int carnum=0;
        for(int i=0;i<top;i++)
        {
            cin>>a;
            if(str[a]==0)str[a]=num++,d[carnum++]=str[a];
            car[str[a]]++;
        }
        int u,v,t;
        while(m--)
        {
            cin>>a>>b>>c;
            if(str[a]==0)str[a]=num++;
            u=str[a];
            if(str[c]==0)str[c]=num++;
            v=str[c];
            int sum=0;
            int k=0;
            while(b[k]=='-'||b[k]=='<')k++;
            while(b[k]!='-')sum=sum*10+b[k]-'0',k++;
            t=sum;
            if(b[0]=='<')g[v][u]=min(g[v][u],t);
            if(b[b.length()-1]=='>')g[u][v]=min(g[u][v],t);
        }

        Dijkstra(start,dis1);

        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
            swap(g[i][j],g[j][i]);

        Dijkstra(start,dis2);

        int ans=0;
        for(int i=0;i<carnum;i++)
        {
            int v=d[i];
            ans+=(dis1[v]+dis2[v])*car[v];
        }
        printf("%d. %d\n",cot++,ans);
    }
}

HDU 2923 Einbahnstrasse

时间: 2024-10-08 11:59:00

HDU 2923 Einbahnstrasse的相关文章

HDU 2923 Einbahnstrasse(最短路 Floyd)

Einbahnstra  e (German for a one-way street) is a street on which vehicles should only move in one direction. One reason for having one-way streets is to facilitate a smoother flow of traffic through crowded areas. This is useful in city centers, esp

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

hdu 2923 map+Floyd 拉破车

有向图 具体方向看箭头 从起点到指定城市拉破车,一个城市可能有多个破车,一次只能拉一辆破车 也就是到了指定地点后要回到起点 假如有100辆破车 但是只有一个城市有 就得在起点与这个城市间往返100次所以要用s1记录 然后 貌似这题是有重边的.... sscanf(s4,"%d" ,&w) ; 这个是错的=.= 在这折腾了半天 Sample Input4 2 5 //城市数 破车数 边数NewTroy Midvale Metrodale //起点 + 有破车的城市NewTroy

hdu 2923 floyd一次性求最小边

#include <stdio.h> #include <string> #include <iostream> #include <queue> #include <map> using namespace std; #define INF 0x7fffff #define MAX 200 int path[MAX][MAX]; int arry[10000]; map<string, int>list; map<string

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

hdu图论题目分类

=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 基础并查集★ 1325&&poj1308 Is It A Tree? 基础并查集★ 1856 More is better 基础并查集★ 1102 Constructing Roads 基础最小生成树★ 1232 畅通工程 基础并查集★ 123

HDU 专题分类

[背包问题] 2602 Bone Collector 1114 Piggy-Bank 1203 I NEED A OFFER! 1171 Big Event in HDU 1059 Dividing 2844 Coins 2191 悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 2159 FATE 1561 The more, The Better 1011 Starship Troopers 2639 Bone Collector II 3033 I love sneakers! 2955

题单二:图论500

http://wenku.baidu.com/link?url=gETLFsWcgddEDRZ334EJOS7qCTab94qw5cor8Es0LINVaGMSgc9nIV-utRIDh--2UwRLvsvJ5tXFjbdpzbjygEdpGehim1i5BfzYgYWxJmu ==========  以下是最小生成树+并查集=========================[HDU]1213         How Many Tables        基础并查集★1272         小

图论五百题!

生死看淡不服就淦,这才是人生! =============================以下是最小生成树+并查集======================================[HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree? 基础并查集★1856 More is better 基础并查集★1102 Constructing Roads 基础最小生成树★1232 畅通工程 基