CodeForces

来源:互联网 发布:淘宝认证应该注意事项 编辑:程序博客网 时间:2024/06/03 05:19

题目链接:http://codeforces.com/problemset/problem/449/B

题目大意:两个点之间可能是道路相连,也可能是铁路相连,问在不影响首都到其他城市的最短路径的前提下,最多可以删多少条铁路

解题思路:直接跑一遍Dijkstra,如果到某个点的最短路的前一条是铁路,那么标记一下,如果有相同长度的不是铁路的,就替换,如果是更短的铁路的,也替换

AC代码:

#include<cstdio>#include<queue>#include<cstring>using namespace std;const int Maxn = 4 * 100000 + 5;struct Edge{    int v, w, next,flag;//flag是铁路标记    Edge(int v=0,int w=0,int next=0,int flag=0):v(v),w(w),next(next),flag(flag){}}edge[Maxn<<1];struct Node{    int numb,dis;    Node(int numb=0,int dis=0):numb(numb),dis(dis){}    bool operator<(const Node& a)const    {        return dis > a.dis;    }};int head[Maxn], edgnum;bool vis[Maxn], pre[Maxn];int dis[Maxn];int ans;void toInit(){    ans = 0;    edgnum = 0;    memset(vis, 0, sizeof(vis));    memset(head, -1, sizeof(head));    memset(pre, 0, sizeof(pre));    memset(dis, 0x3f, sizeof(dis));}void toAdd(int u,int v,int w,int flag){    edge[edgnum] = Edge(v, w, head[u], flag);    head[u] = edgnum++;}void Dijs(int s){    priority_queue<Node> pqn;    pqn.push(Node(s, 0));    dis[s] = 0;    while (!pqn.empty())    {        Node u = pqn.top();pqn.pop();        if (vis[u.numb]) continue;        vis[u.numb] = 1;        for (int i = head[u.numb];i != -1;i = edge[i].next)        {            int v = edge[i].v;            if (u.dis + edge[i].w < dis[v])            {                if (pre[v] == 1)                {                    ans--;                    pre[v] = 0;                }                if (edge[i].flag == 1)                {                    pre[v] = 1;                    ans++;                }                dis[v] = u.dis + edge[i].w;                pqn.push(Node(v, dis[v]));            }            else if (u.dis + edge[i].w == dis[v] && pre[v] == 1 && edge[i].flag == 0)            {                ans--;                pre[v] = 0;            }        }    }}int main(){    toInit();    int n, m, k;    scanf("%d%d%d", &n, &m, &k);    while (m--)    {        int ui, vi, xi;        scanf("%d%d%d", &ui, &vi, &xi);        toAdd(ui, vi, xi, 0);        toAdd(vi, ui, xi, 0);    }    for(int i=1;i<=k;++i)    {        int si, yi;        scanf("%d%d", &si, &yi);        toAdd(1, si, yi, 1);    }    Dijs(1);    printf("%d\n", k-ans);    return 0;}
原创粉丝点击