码迷,mamicode.com
首页 > 其他好文 > 详细

Uva(10986)

时间:2015-10-13 22:38:20      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

很裸的一道dijk算法题,因为顶点数太多无法用邻接矩阵表示,所以要用临界表来表示

AC代码

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector> 
#include<iostream>
#include<algorithm>
using namespace std;
using namespace std;
const int maxn=2*50000;
#define inf 99999999
struct node
{
    int v;
    int u;
    int w;
    int next;
}V[maxn];
int head[maxn];
int d[maxn];
int n,m,s,t;
int tol;
int done[maxn];
typedef pair<int,int>pii; 
priority_queue<pii,vector<pii>,greater<pii> >q;
void init()
{
    tol=0;
    memset(head,-1,sizeof(head));
}
void dijk()
{
    memset(done,0,sizeof(done));
    for(int i=0;i<=n;i++)
    d[i]=inf;
    d[s]=0;
    q.push(make_pair(d[s],s));
    while(!q.empty())
    {
      pii  u=q.top();
      q.pop();
      int x=u.second;
      if(done[x])
      continue;
      done[x]=1;
      for(int e=head[x];e!=-1;e=V[e].next) 
      {
         int v=V[e].v;
         int w=V[e].w;
         if(d[x]+w<d[v])
         {
             d[v]=d[x]+w;
             q.push(make_pair(d[v],v));
         }
      }
   }  
      if(d[t]==inf)
      printf("unreachable\n");
      else
      printf("%d\n",d[t]);
}
int main()
{
    int T;
    int tmp=0;
    scanf("%d",&T);
    while(T--)
    {
    scanf("%d %d %d %d",&n,&m,&s,&t);
    init();
    m*=2;
    int u,v,w;
    for(int i=0;i<m;i+=2)
    {
        scanf("%d %d %d",&u,&v,&w);
        V[i].u=u;
        V[i].v=v;
        V[i].w=w;
        V[i].next=head[u];
        head[u]=i;
        V[i+1].u=v;
        V[i+1].v=u;
        V[i+1].next=head[v];
        V[i+1].w=w;
        head[v]=i+1; 
    }
     printf("Case #%d: ",++tmp);
    dijk();    
   }
   return 0;    
} 

 

Uva(10986)

标签:

原文地址:http://www.cnblogs.com/NaCl/p/4876058.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!