POJ 1125 Stockbroker Grapevine 最短路水题floyd || dijkstra

水题一枚

数据规模不是很大,可以用floyd暴力过

View Code
#include<stdio.h>
#include<string.h>
#define INF 30
#define maxn 101

int dis[maxn][maxn];
int n, m;

void floyd()
{
    int i, j, k;
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(k!=i&&k!=j)
                    if(dis[i][k]+dis[k][j] < dis[i][j])
                        dis[i][j]= dis[i][k] + dis[k][j];
    int min = INF,max, v=-1;
    for(i=1;i<=n;i++)
    {
        max = -1;
        for(j=1;j<=n;j++)
            if(max < dis[i][j]&&i!=j)
                max = dis[i][j];
        if(max < min)
        {
            min = max;
            v = i;
        }
    }
    if(v == -1)puts("disjoint");
    else printf("%d %d\n",v, min);
}
int main()
{
    int i ,j,y, w;
    while(~scanf("%d",&n)&&n)
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                dis[i][j]=INF;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&m);
            while(m--)
            {
                scanf("%d%d",&y,&w);
                if(dis[i][y] > w)dis[i][y] = w;
            }
        }
        floyd();
    }
    return 0;
}


dijstra也能过

View Code
#include<stdio.h>
#include<string.h>
#define maxn 1001
#define INF 20

int dis[maxn],adj[maxn][maxn];
bool vis[maxn];
int m, n;

int dijkstra(int v)
{
    int i ,j ,k, u, min;
    for(i=0;i<=n;i++)
    {
        dis[i]=adj[v][i];
        vis[i]=0;
    }
    vis[v]=1;dis[v]=0;
    for(i=1;i<n;i++)
    {
        min =INF;
        for(j=1;j<=n;j++)
        {
            if(min > dis[j]&&!vis[j])
            {
                min = dis[j];
                u = j;
            }
        }
        if(min == INF)break;
        vis[u] = 1;
        for(j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[u]+adj[u][j] < dis[j])
            {
                dis[j] = dis[u] +adj[u][j];
            }
        }
    }
    return min;
}
int main()
{
    int y, w,i,j;
    while(~scanf("%d",&n)&&n)
    {
        for(i=0;i<=n;i++)
        {
            for(j=0;j<=n;j++)
            adj[i][j] = INF;
        }
        for(i=1;i<=n;i++)
        {
            scanf("%d",&m);
            while(m--)
            {
                scanf("%d%d",&y,&w);
                if(adj[i][y] > w)adj[i][y]=w;
            }
        }
        int min =INF,num;
        for(i=1;i<=n;i++)
        {
            int temp = dijkstra(i);
            if(temp < min)
            {
                min = temp;
                num = i;
            }
        }
        if(min == INF)puts("disjoint");
        else printf("%d %d\n",num, min);
    }
    return 0;
}

 

posted @ 2012-07-23 22:58  To be an ACMan  Views(182)  Comments(0)    收藏  举报