当前位置:编程学习 > C/C++ >>

27/7/2012 ICPC培训

眨眼培训就过了大半喽。我还是很喜欢的。。。
上午做了HDU2112
还是求最短路径的,不同的是这题没有直接给地点标号,需要我们来处理。
这题要注意一下集中情况:
1、start、end地点在下面的路径中不一点会出现,所以在标号时需要对这两个点也处理。
2、无向图的处理可能会增加时间复杂度,但不会改变最短路径的长度,因为除非是负权边,
否则a->b被处理过,b->a一点不会被处理了。
3、这题的建图。利用temp[][]表将地点不重复地存储起来,建立地点和数字标号间的唯一对应
关系。然后在查找建图。
4、SPFA算法,不仅仅可以求出最短路径,还可以判断两点是否连通。(有向图、无向图均可)
代码:
[cpp] 
#include<iostream> 
#include<vector> 
#include<queue>  
using namespace std; 
 
const int maxRoad=10001;  //路径数  
const int maxSize=151;    //地点数  
const int maxLen=31;      //地点的最大长度  
const int INF=0x7fffffff; 
 
struct node   //边  

    char start[maxLen]; 
    char end[maxLen]; 
    int from; 
    int to; 
    int cost; 
}edge[maxRoad]; 
  
int minPath[maxSize];   //最短路  
bool inQ[maxSize];       //是否在队列中  
int numEdge,numAdress,from,to;  //路径数、点数、起点、终点  
char start[maxLen],end[maxLen]; 
char temp[maxSize][maxLen];    //不重复存放地存放每个点  
vector<node> myV[maxSize];     //连接表  
 
int findIndex(char c[])   //找地点的标示  

    for(int i=0;i<numAdress;i++) 
    { 
        if(strcmp(c,temp[i])==0) 
        { 
            return i; 
        } 
    } 
     
    return -1; 
}  
      
void input() 

    numAdress=0; 
    getchar();  
    scanf("%s%s",&start,&end); 
     
    //如果不在temp[][]表中就放进去  
    if(findIndex(start)==-1) strcpy(temp[numAdress++],start); 
    if(findIndex(end)==-1) strcpy(temp[numAdress++],end);  
     
    for(int i=0;i<numEdge;i++) 
    { 
        getchar();  
        scanf("%s%s%d",&edge[i].start,&edge[i].end,&edge[i].cost); 
         
        if(findIndex(edge[i].start)==-1)  strcpy(temp[numAdress++],edge[i].start); 
        if(findIndex(edge[i].end)==-1) strcpy(temp[numAdress++],edge[i].end); 
    } 
}  
 
void buildMap() 

    for(int j=0;j<maxSize;j++) 
    { 
        myV[j].clear(); 
    } 
      
    from=findIndex(start); 
    to=findIndex(end); 
     
    for(int i=0;i<numEdge;i++) 
    { 
        //建立无向图  
        edge[i].from=findIndex(edge[i].start); 
        edge[i].to=findIndex(edge[i].end);   
        myV[edge[i].from].push_back(edge[i]);  
         
        edge[i].to=findIndex(edge[i].start); 
        edge[i].from=findIndex(edge[i].end);   
        myV[edge[i].from].push_back(edge[i]); 
    } 
}         
 
void SPFA() 

    for(int i=0;i<maxSize;i++)  minPath[i]=INF; 
    minPath[from]=0; 
    memset(inQ,false,sizeof(inQ)); 
    inQ[from]=true;  
     
    queue<int> myQ; 
    myQ.push(from); 
      
    while(!myQ.empty()) 
    { 
        int from,to,cost; 
        from=myQ.front(); 
        myQ.pop(); 
         
        for(int j=0;j<myV[from].size();j++) 
        { 
            to=myV[from][j].to; 
            cost=myV[from][j].cost+minPath[from]; 
             
            if(cost<minPath[to]) 
            { 
                minPath[to]=cost; 
                 
                if(!inQ[to]) 
                { 
                    inQ[to]=true; 
                    myQ.push(to); 
                } 
            } 
        } 
         
        inQ[from]=false;  
    } 
     
    if(minPath[to]!=INF) printf("%d\n",minPath[to]); 
    else printf("-1\n");  
}     
      
int main() 

    whil

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,