POJ3268—Silver Cow Party

来源:互联网 发布:三星4621ns 网络打印 编辑:程序博客网 时间:2024/05/28 15:57

题目很简单,开始写时用的是Floyd算法,结果是TLE,后来改用两次Dijkstra算法,求开会地点到其余各点的距离和其余各点到开会地点的距离,同一个点的两个距离之和最大就是所要求的。

 

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=1002;const int inf=100000000;int n,t;bool visit[maxn];int dist1[maxn],dist2[maxn],w[maxn][maxn];void Dijkstra1(int v){    int i,j,u,min;    for(i=0;i<n;i++)    if(i!=v)    dist1[i]=w[v][i];           //点t-1到点i的距离    visit[v]=true;    for(i=1;i<n;i++)    {        min=inf;        for(j=0;j<n;j++)        if(!visit[j] && dist1[j]<min)        {            min=dist1[j];            u=j;        }        visit[u]=true;        for(j=0;j<n;j++)        if(!visit[j] && dist1[u]+w[u][j]<dist1[j])        dist1[j]=dist1[u]+w[u][j];    }}void Dijkstra2(){    int i,j,u,min;    for(i=0;i<n;i++)    dist2[i]=w[i][t-1];      //点i到点t-1的距离    dist2[t-1]=0;    visit[t-1]=true;    for(i=1;i<n;i++)    {        min=inf;        for(j=0;j<n;j++)        if(!visit[j] && dist2[j]<min)        {            min=dist2[j];            u=j;        }        visit[u]=true;        for(j=0;j<n;j++)        if(!visit[j] && w[j][u]+dist2[u]<dist2[j])        dist2[j]=w[j][u]+dist2[u];    }}int main(){    int i,j,m,a,b,c,max;    scanf("%d%d%d",&n,&m,&t);    for(i=0;i<n;i++)    for(j=0;j<n;j++)    w[i][j]=inf;    for(i=0;i<m;i++)    {        scanf("%d%d%d",&a,&b,&c);        w[a-1][b-1]=c;    }    memset(visit,0,sizeof(visit));    Dijkstra1(t-1);                      //计算结点t-1到其余各点的距离    memset(visit,0,sizeof(visit));    Dijkstra2();                      //计算其余各点到结点t-1的距离    max=0;    for(i=0;i<n;i++)    if(i!=t-1 && max<dist1[i]+dist2[i])    max=dist1[i]+dist2[i];    printf("%d\n",max);    return 0;}


 

原创粉丝点击