Jzzhu and Cities CodeForces

来源:互联网 发布:淘宝瑜伽服哪家店铺好 编辑:程序博客网 时间:2024/05/16 23:46

点击打开链接

做的很迷的一道题。。

开始用Dijkstra 将公路铁路都加入图中 看每一个有铁路直达的点 能否通过除这条直达铁路之外的路径来松弛 即该点是否存在代价小于等于这条铁路的路径

WA的很离谱 一时还找不到问题的原因 留坑。。也希望路过的大佬指正。。


再用spfa 只把有铁路直达的点加入队列 但铁路不加入图中 使图中只有公路 就过了(这里存图只能用vector 用链式前向星就会在最后一个样例TLE)

说明对最短路算法理解很不到位。。

#include <bits/stdc++.h>using namespace std;#define ll long long#define N 0x3f3f3f3f3f3f3f3fstruct node{    int v;    ll w;};queue <int> que;vector <node> edge[100010];ll dis[100010];int first[100010],book[100010],flag[100010];int n,m,k,sum;void calculate(){    node tem;    ll w;    int i,u,v;    while(!que.empty())    {        u=que.front();        que.pop();        book[u]=0;        for(i=0;i<edge[u].size();i++)        {            tem=edge[u][i];            v=tem.v,w=tem.w;            if(dis[v]>=dis[u]+w)            {                dis[v]=dis[u]+w;                if(book[v]==0)                {                    que.push(v);                    book[v]=1;                }                flag[v]=0;            }        }    }    return;}int main(){    node tem;    ll w;    int i,u,v,sum;    while(scanf("%d%d%d",&n,&m,&k)!=EOF)    {        for(i=1;i<=n;i++)        {            edge[i].clear();        }        for(i=1;i<=m;i++)        {            scanf("%d%d%lld",&u,&v,&w);            tem.v=v,tem.w=w;            edge[u].push_back(tem);            tem.v=u,tem.w=w;            edge[v].push_back(tem);        }        while(!que.empty()) que.pop();        memset(dis,0x3f,sizeof(dis));        memset(book,0,sizeof(book));        memset(flag,0,sizeof(flag));        que.push(1);        dis[1]=0;        book[1]=1;        sum=0;        for(i=1;i<=k;i++)        {            scanf("%d%lld",&v,&w);            if(dis[v]==N)            {                dis[v]=w;            }            else            {                sum++;                if(dis[v]>w) dis[v]=w;            }            flag[v]=1;        }        for(i=1;i<=n;i++)        {            if(flag[i]==1)            {                que.push(i);                book[i]=1;            }        }        calculate();        sum=0;        for(i=1;i<=n;i++)        {            sum+=flag[i];        }        printf("%d\n",k-sum);    }    return 0;}



以下是WA代码。。

#include <bits/stdc++.h>using namespace std;#define ll long long#define N 0x3f3f3f3f3f3f3f3fstruct nodeI{    int tp;    int v;    ll w;    int next;};struct nodeII{    friend bool operator < (nodeII n1,nodeII n2)    {        return n1.s>n2.s;    }    int id;    ll s;};nodeI edge[700010];ll dis[100010],flag[100010];int first[100010],book[100010];int n,m,k,num,sum;void addedge(int tp,int u,int v,ll w){    edge[num].tp=tp;    edge[num].v=v;    edge[num].w=w;    edge[num].next=first[u];    first[u]=num++;    return;}void calculate(){    priority_queue <nodeII> que;    nodeII cur,tem;    ll w;    int i,tp,u,v;    memset(dis,0x3f,sizeof(dis));    memset(book,0,sizeof(book));    tem.id=1,tem.s=0;    que.push(tem);    dis[1]=0;    while(!que.empty())    {        cur=que.top();        que.pop();        u=cur.id;        if(book[u]==1) break;        book[u]=1;        for(i=first[u];i!=-1;i=edge[i].next)        {            tp=edge[i].tp,v=edge[i].v,w=edge[i].w;            if(book[v]==0&&dis[v]>dis[u]+w)            {                dis[v]=dis[u]+w;                tem.id=v;                tem.s=dis[v];                que.push(tem);            }            if(flag[v]!=0&&tp==1)            {                if(flag[v]>=dis[u]+w)                {                    flag[v]=0;                    sum++;                }            }        }    }    return;}int main(){    ll w;    int i,u,v;    while(scanf("%d%d%d",&n,&m,&k)!=EOF)    {        memset(first,-1,sizeof(first));        memset(flag,0,sizeof(flag));        num=0;        for(i=1;i<=m;i++)        {            scanf("%d%d%lld",&u,&v,&w);            addedge(1,u,v,w);            addedge(1,v,u,w);        }        sum=0;        for(i=1;i<=k;i++)        {            scanf("%d%lld",&v,&w);            addedge(2,1,v,w);            if(flag[v]==0)            {                flag[v]=w;            }            else            {                sum++;                if(w<flag[v])                {                    flag[v]=w;                }            }        }        calculate();        printf("%d\n",sum);    }    return 0;}


原创粉丝点击