hdu6181Two Paths(次短路模板题)

来源:互联网 发布:linux ext3 ext4 区别 编辑:程序博客网 时间:2024/06/08 04:09

思路:

裸的次短路题,多校的时候直接网上找了个模板,改了改范围和变量类型就1a了,看来很好用,直接盗取了=。=

代码:

#include <cstdio>#include <iostream>#include <cstring>#include <cmath>#include <algorithm>#include <string.h>#include <string>#include <vector>#include <queue>#define MEM(a,x) memset(a,x,sizeof a)#define eps 1e-8#define MOD 10009#define MAXN 100010#define MAXM 100010#define INF 0x3f3f3f3f#define INFF 0x3f3f3f3f3f3f3f3f#define ll long long#define bug cout<<"here"<<endl#define fread freopen("ceshi.txt","r",stdin)#define fwrite freopen("out.txt","w",stdout)using namespace std;struct Edge{    int v,next;    ll w;}edge[MAXM*2];ll d[MAXN],rd[MAXN];int tot,head[MAXN];int vis[MAXN];int n,m;void init(){    tot=0;    MEM(head,-1);    for(int i=0;i<=n;i++)        d[i]=rd[i]=INFF;}void addedge(int u,int v,ll w){    edge[tot].v=v;    edge[tot].w=w;    edge[tot].next=head[u];    head[u]=tot++;}void SPFA(int s,ll dis[]){    int u,v;    queue<int> q;    MEM(vis,0);    dis[s]=0; vis[s]=1;    q.push(s);    while(!q.empty())    {        u=q.front(); q.pop();        vis[u]=0;        for(int i=head[u];i!=-1;i=edge[i].next)        {            v=edge[i].v;            if(dis[u]+edge[i].w<dis[v])            {                dis[v]=dis[u]+edge[i].w;                if(!vis[v])                {                    vis[v]=1;                    q.push(v);                }            }        }    }}int main(){//    fread;    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        init();        while(m--)        {            int u,v;            ll w;            scanf("%d%d%lld",&u,&v,&w);            addedge(u,v,w);            addedge(v,u,w);        }        SPFA(1,d);        SPFA(n,rd);        ll ans=INFF;        for(int i=1;i<=n;i++)        {            for(int j=head[i];j!=-1;j=edge[j].next)            {                int v=edge[j].v;                ll w=edge[j].w;                ll  tmp=d[i]+rd[v]+w;                if(tmp>d[n]&&ans>tmp)                    ans=tmp;            }        }        printf("%lld\n",ans);    }    return 0;}