poj 3259 Wormholes 夜

http://poj.org/problem?id=3259

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#define Max 0xfffffff
using namespace std;
struct node
{
    int i,j;
}mem[5500];
int main()
{
    //freopen("r","data.txt",stdin);
    int n,m,w,M;
    int i,j,l;
    int f;
    int path[505][505];
    int dis[505];
    cin>>f;
    while(f--)
    {
        cin>>n>>m>>w;
         for(i=1;i<=n;i++)
        {
            for(j=i;j<=n;j++)
            {
                path[i][j]=path[j][i]=Max;
            }
        }
        while(m--)
        {
           cin>>i>>j>>l;
           if(l<path[i][j])
           {
               path[i][j]=path[j][i]=l;
           }
        }

        while(w--)
        {
            cin>>i>>j>>l;
            if((-l)<path[i][j])
            {
                path[i][j]=(-l);
            }
        }
        l=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(path[i][j]!=Max)
                {
                    mem[l].i=i;
                    mem[l].j=j;
                    l++;
                }
            }
        }
        M=l;

        for(i=1;i<=n;i++)
        {
            dis[i]=path[1][i];
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<M;j++)
            {
                if(dis[mem[j].j]>dis[mem[j].i]+path[mem[j].i][mem[j].j])
                {
                    dis[mem[j].j]=dis[mem[j].i]+path[mem[j].i][mem[j].j];
                }
            }
        }
        for(l=0;l<M;l++)
        {
            if(dis[mem[l].j]>dis[mem[l].i]+path[mem[l].i][mem[l].j])
            {
                dis[mem[l].j]=dis[mem[l].i]+path[mem[l].i][mem[l].j];
                break;
            }
        }
        if(l<M)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/liulangye/p/2415938.html