http://acm.hdu.edu.cn/showproblem.php?pid=2066

裸最短路,一开始又sb了,处理错复杂度TLE,囧

View Code
#include <stdio.h>
#include <string.h>
const int INF=1000000001;
const int maxn=1001;
int G[maxn][maxn];
int dis[maxn];
int vis[maxn];
int node1[maxn],node2[maxn];
int n;
void Dijkstra(int s)
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<=n;i++)
        dis[i]=INF;
    dis[s]=0;
    for(int i=0;i<n;i++)
    {
        int ans=INF,u;
        for(int j=1;j<=n;j++)
            if(!vis[j] && dis[j]<ans)
            {
                ans=dis[j];
                u=j;
            }
        vis[u]=1;
        for(int j=1;j<=n;j++)
            if(!vis[j] && G[u][j]+dis[u]<dis[j])
                dis[j]=G[u][j]+dis[u];
    }
}
int main()
{
    int T,S,D;
    while(~scanf("%d%d%d",&T,&S,&D))
    {
        int a,b,time;
        for(int i=0;i<1001;i++)
            for(int j=0;j<1001;j++)
                G[i][j]=INF;
        n=0;
        while(T--)
        {
            scanf("%d%d%d",&a,&b,&time);
            if(G[a][b]>time)
                G[a][b]=G[b][a]=time;
            if(n<a)n=a;
            if(n<b)n=b;
        }
        for(int i=1;i<=S;i++)
            scanf("%d",&node1[i]);
        for(int i=1;i<=D;i++)
            scanf("%d",&node2[i]);
        int ans=INF;
        for(int i=1;i<=S;i++)
        {
            Dijkstra(node1[i]);
            int minn=INF;
            for(int j=1;j<=D;j++)
                if(dis[node2[j]]<minn)minn=dis[node2[j]];
            if(ans>minn)ans=minn;
        }
        printf("%d\n",ans);
    }
    return 0;
}