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

HDU ACM 1874 畅通工程续

时间:2015-04-27 09:50:06      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   图论   

分析:模版题,直接套用模版即可。


#include<iostream>
#include<queue>
using namespace std;

int u[2002];
int v[2002];
int w[2002];
bool vis[202];
int d[202];
int first[202];
int Next[2002];

void Init(int n,int m)
{
    int i;

    for(i=0;i<n;i++)
    {
        vis[i]=false;
        first[i]=-1;
    }
    for(i=0;i<m;i++)
        Next[i]=-1;
}

void spfa(int n,int s)    //flag表示当前处理的是反向建立后的图还是一开始的图,false反向,true开始
{
    queue<int> q;
    int i,x,y;

    for(i=0;i<n;i++)
        d[i]=(i==s)?0:0x7fffffff;   //初始化,自己到自己为0,其他到自己相当于无穷大

    q.push(s);
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        vis[x]=false;
        for(i=first[x];i!=-1;i=Next[i])
        {
            y=v[i];
            if(d[y]>d[x]+w[i])
            {
                d[y]=d[x]+w[i];
                if(!vis[y])
                {
                    vis[y]=true;         
                    q.push(y);
                }
            }
        }
    }
}

void Read(int m)
{
    int i,a,b;

    for(i=0;i<m;i++)
    {
        scanf("%d %d %d",&a,&b,&w[i]);
        u[i]=a;                        //存储正向边,因为是无向图
        v[i]=b;
        Next[i]=first[a];
        first[a]=i;

        w[i+1]=w[i];                //存储反向边
        i++;
        u[i]=b;
        v[i]=a;
        Next[i]=first[b];
        first[b]=i;
    }
}

void Output(int t)
{
	if(d[t]==0x7fffffff)
		puts("-1");
	else
		printf("%d\n",d[t]);
}

int main()
{
    int n,m;
    int s,t;

    while(scanf("%d %d",&n,&m)==2)
    {
        Init(n,m+m);  //m+m是因为无向边,每条都要保存两条
        Read(m+m);
        scanf("%d %d",&s,&t);
        spfa(n,s);
        Output(t);

    }
    return 0;    
}


HDU ACM 1874 畅通工程续

标签:c   c++   acm   算法   图论   

原文地址:http://blog.csdn.net/a809146548/article/details/45293815

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