【最短路】变形-- nyoj 1248 海岛争霸、poj 1797 Heavy Transportation

来源:互联网 发布:邮箱的正则表达式的js 编辑:程序博客网 时间:2024/05/18 02:47

nyoj 1248:

题意:好像是中文;

思路:每个询问给出a、b,要求找到a-b的哪条路上的最大值是最小的,输出这个最小值;

代码:

 #include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int maxn=110;const int inf=0x3f3f3f3f;int cost[maxn][maxn];int dis[maxn];int vis[maxn];int N,M;int dijk(int s,int e){    memset(vis,false,sizeof(vis));    memset(dis,0x3f,sizeof(dis));    vis[s]=1;    for(int i=1; i<=N; i++)        dis[i]=cost[s][i];    for(int i=1; i<N; i++)    {        int minn=inf;        for(int j=1; j<=N; j++)        {            if(!vis[j]&&dis[j]<minn)            {                minn=dis[j];                s=j;            }        }        vis[s]=1;        for(int j=1; j<=N; j++)        {            dis[j]=min(max(dis[s],cost[s][j]),dis[j]);        }    }    if(dis[e]!=inf)        printf("%d\n",dis[e]);    else        printf("-1\n");}int main(){    scanf("%d%d",&N,&M);    memset(cost,0x3f,sizeof(cost));    for(int i=0; i<=N; i++) cost[i][i]=inf;    for(int i=0; i<M; i++)    {        int u,v,w;        scanf("%d%d%d",&u,&v,&w);        cost[u][v]=cost[v][u]=w;    }    int n;    scanf("%d",&n);    while(n--)    {        int a,b;        scanf("%d%d",&a,&b);        dijk(a,b);//        printf("%d\n",b);    }    return 0;}        

poj 1797:

题意:解释以下样例:1-3有两条路,(1):1-2-3 最大承重为3;(2):1-3最大承重为4;所以输出1-3的最大承重为4;

思路:一个简单的dijk变形;但是我写了一个多小时,这道题要求的是1-n的那条路的最小值是最大的;那么求最大值就要給cost[]赋初值为最小!

代码:

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int maxn=1100;const int inf=0x3f3f3f3f;int cost[maxn][maxn];int dis[maxn];int vis[maxn];int N,M;int dijk(int s){    memset(vis,false,sizeof(vis));    vis[s]=1;    for(int i=1; i<=N; i++)        dis[i]=cost[s][i];    for(int i=1; i<N; i++)    {        int maxx=0;        for(int j=1; j<=N; j++)        {            if(!vis[j]&&dis[j]>maxx)            {                maxx=dis[j];                s=j;            }        }        vis[s]=1;        for(int j=1; j<=N; j++)        {            if(!vis[j])            {                dis[j]=max(min(dis[s],cost[s][j]),dis[j]);            }        }    }    return dis[N];}int main(){    int T;    scanf("%d",&T);    int t=1;    while(t)    {        scanf("%d%d",&N,&M);        memset(cost,-0x3f,sizeof(cost));  //注意初始化,要求承重的最大值,所以赋值cost数组为最小;        for(int i=0; i<=N; i++) cost[i][i]=0;          for(int i=0; i<M; i++)        {            int u,v,w;            scanf("%d%d%d",&u,&v,&w);            cost[u][v]=cost[v][u]=w;        }        int ans=dijk(1);        printf("Scenario #%d:\n%d\n",t,ans);        if(t!=T)            printf("\n");        else            break;        t++;    }    return 0;}


0 0
原创粉丝点击