poj 2368 Silver Cow Party

来源:互联网 发布:彩票组合软件手机软件 编辑:程序博客网 时间:2024/05/21 09:34

这道题主要是要求多个地方到一个点的最短距离,这样其实把距离反过来存到edge里就行了。逆向求

还是用dijkstra算法。

用floyd算法复杂度是n*n*n!!超时了

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;int dict[1005],bdict[1005],edge[1005][1005],bedge[1005][1005];int n,m,x;bool vis[1005];int maxx(int x,int y) {    if(x > y)         return x;    else         return y;}void dijkstra(int *dict,int x) {    memset(vis,false,sizeof(vis));    dict[x] = 0;vis[x] = true;    int max,k,now = x;    for(int j = 1;j <= n-1;j++) {        max = inf;        for(int i = 1;i <= n;i++) {            if(!vis[i]) {                if(dict[i] > dict[now] + edge[now][i] && edge[now][i] != 0)                    dict[i] = dict[now] + edge[now][i];                if(max > dict[i])                    max = dict[k = i];            }        }        now = k;        vis[k] = true;    }    /*for(int i = 1;i <= n;i++)        printf("%d ",dict[i]);    printf("\n"); */}void bdijkstra(int *bdict,int x) {    memset(vis,false,sizeof(vis));    bdict[x] = 0;vis[x] = true;    int max,k,now = x;    for(int j = 1;j <= n-1;j++) {        max = inf;        for(int i = 1;i <= n;i++) {            if(!vis[i]) {                if(bdict[i] > bdict[now] + bedge[now][i] && bedge[now][i] != 0)                    bdict[i] = bdict[now] + bedge[now][i];                if(max > bdict[i])                    max = bdict[k = i];            }        }        now = k;        vis[k] = true;    }    /*for(int i = 1;i <= n;i++)        printf("%d ",bdict[i]);    printf("\n");*/}int main() {    scanf("%d%d%d",&n,&m,&x);    int s,e,value;    memset(edge,0,sizeof(edge));    memset(bedge,0,sizeof(bedge));    for(int i = 1;i <= m;i++) {        scanf("%d%d%d",&s,&e,&value);        if(edge[s][e] == 0 || edge[s][e] > value)             edge[s][e] = value;        if(bedge[e][s] == 0 || bedge[e][s] > value)            bedge[e][s] = value;    }    memset(dict,inf,sizeof(dict));    dijkstra(dict,x);    memset(bdict,inf,sizeof(bdict));    bdijkstra(bdict,x);    int ans = 0;    for(int i = 1;i <= n;i++) {        ans = maxx(ans,dict[i]+bdict[i]);    }    printf("%d\n",ans);}

最后面还是贴一下floyd算法的方法吧,很简洁虽然超时了!


#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;int edge[1005][1005],n,m,x;int maxx(int x,int y) {    if(x > y)        return x;    else         return y;}void floyd() {    for(int i = 1;i <= n;i++)//一个点到它本身距离为0;        edge[i][i] = 0;    for(int k = 1;k <= n;k++)        for(int i = 1;i <= n;i++)            for(int j = 1;j <= n;j++)                if(edge[i][k] != inf && edge[k][j] != inf && edge[i][k] + edge[k][j] < edge[i][j])                    edge[i][j] = edge[i][k] + edge[k][j];}int main() {     scanf("%d%d%d",&n,&m,&x);    int s,e,value;    memset(edge,inf,sizeof(edge));    for(int i = 1;i <= m;i++) {        scanf("%d%d%d",&s,&e,&value);        if(edge[s][e] > value)            edge[s][e] = value;    }    floyd();    /*for(int i = 1;i <= n;i++) {        for(int j = 1;j <= n;j++)            printf("%d ",edge[i][j]);        printf("\n");    }*/    int ans = 0;    for(int i = 1;i <= n;i++)        ans = maxx(ans,edge[i][x]+edge[x][i]);    printf("%d\n",ans);}


0 0
原创粉丝点击