hdu 2680 dijkstra反向建图

来源:互联网 发布:adobe cc 2018mac破解 编辑:程序博客网 时间:2024/05/21 13:55

http://acm.hdu.edu.cn/showproblem.php?pid=2680

题意:求起点到终点的最短距离,注意这题是有向图,还有这题先给的是终点,起点有多个(如果是无向图的话先给起点终点是一样的,先给终点细细体会稍微有点区别)。

分析:先给终点,起点有多个。我一开始知道是有向图但就是按照无向图做的,好吧,wa了。然后该了该,还是wa。认真读题觉得没问题又提交了还是wa。然后觉得这题很有意思,应该注意什么东西。想到了以前都是先知道起点,然后求dis[end],发现建图的时候要反过来,edge[v][u]=w.一开始就看到有重边,早早就出来了重边,但是数据还是没过,郁闷了,不知道怎么改了数据过了还是wa .我去看了discuss发现思路还是没问题反向图+终点到各点的距离=原图的各点到终点的距离。觉得应该是自己代码哪里出问题了,话说不是一两次了老是在细节出。果然发现输入的时候

View Code
 for(int i=1;i<=m;i++){            scanf("%d%d%d",&u,&v,&w);            edge[v][u]=min(edge[v][u],w);//            if(edge[v][w]>w){//                edge[v][w]=w;//              //  edge[v][u]=w;//            }            //printf("edge[u][v]=%d\n",edge[u][v]);        }

嗨,坑死了。贴完这个刚刚找代码问题的时候发现其实还是前面的问题。嗨。

下面代码是ac的。话说wa了5次

View Code
// I'm lanjiangzhou//C#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <math.h>#include <time.h>//C++#include <iostream>#include <algorithm>#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <cctype>#include <stack>#include <string>#include <list>#include <queue>#include <map>#include <vector>#include <deque>#include <set>using namespace std;//*************************OUTPUT*************************#ifdef WIN32#define INT64 "%I64d"#define UINT64 "%I64u"#else#define INT64 "%lld"#define UINT64 "%llu"#endif//**************************CONSTANT***********************#define INF 0x3f3f3f3f// aply for the memory of the stack//#pragma comment (linker, "/STACK:1024000000,1024000000")//endconst int maxn = 10010;int edge[maxn][maxn];int dis[maxn];int a[maxn];int n,start,end;int m;int S[maxn];int sum=0;int minx;void dijkstra(int v0){    for(int i=1;i<=n;i++){        dis[i]=edge[v0][i];        S[i]=0;    }    S[v0]=1;  dis[v0]=0;    for(int i=1;i<=n-1;i++){        int min=INF,  u=v0;        for(int j=1;j<=n;j++){            if(!S[j]&&dis[j]<min){                u=j;                min=dis[j];            }        }        S[u]=1;        for(int k=1;k<=n;k++){            if(!S[k]&&edge[u][k]<INF&&dis[u]+edge[u][k]<dis[k]){                dis[k]=dis[u]+edge[u][k];                //printf("dis[k]=%d\n",dis[k]);                //sum++;            }        }    }}int main(){    while(scanf("%d%d%d",&n,&m,&end)!=EOF){        //³õʼ»¯        int minx=INF;        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                edge[i][j]=INF;            }            edge[i][i]=0;        }        int u,v,w;        for(int i=1;i<=m;i++){            scanf("%d%d%d",&u,&v,&w);            edge[v][u]=min(edge[v][u],w);//            if(edge[v][w]>w){//                edge[v][w]=w;//              //  edge[v][u]=w;//            }            //printf("edge[u][v]=%d\n",edge[u][v]);        }//        for(int i=1;i<=m;i++){//            for(int j=1;j<)//            printf("%d\n",edge[])//        }        dijkstra(end);        int t;        scanf("%d",&t);        while(t--){            scanf("%d",&start);            //printf("%d\n",dis[start]);            if(dis[start]<minx){                minx=min(dis[start],minx);            }        }        if(minx==INF) printf("-1\n");        else printf("%d\n",minx);    }    return 0;}

 

原创粉丝点击