zoukankan      html  css  js  c++  java
  • UVA10917 Walk Through the Forest

    题目描述

    PDF

    输入输出格式

    输入格式:

     

     

    输出格式:

     

     

    输入输出样例

    输入样例#1: 
    5 6
    1 3 2
    1 4 2
    3 4 3
    1 5 12
    4 2 34
    5 2 24
    7 8
    1 3 1
    1 4 1
    3 7 1
    7 4 1
    7 5 1
    6 7 1
    5 2 1
    6 2 1
    0
    输出样例#1: 
    2
    4

     

    Solution:

      常规()题,考试的时候细节写挂。

      首先以$2$为源点处理出到其他点的最短路,然后遍历一遍图,标记那些不满足$dis[u]>dis[v]$的边,最后只要从$1$广搜一下处理出答案就好了,广搜时记录一下所到边的变化值,用变化值去更新答案。

    代码:

    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
    #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
    using namespace std;
    const int N=100005;
    int n,m,to[N],net[N],w[N],dis[N],h[N],cnt;
    int ans[N],deta[N];
    bool vis[N],ct[N];
    
    il int gi(){
        int a=0;char x=getchar();bool f=0;
        while((x<'0'||x>'9')&&x!='-')x=getchar();
        if(x=='-')x=getchar(),f=1;
        while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+x-48,x=getchar();
        return f?-a:a;
    }
    
    il void add(int u,int v,int c){to[++cnt]=v,net[cnt]=h[u],h[u]=cnt,w[cnt]=c;}
    
    queue<int>q;
    
    il void pre(){
        memset(dis,0x3f,sizeof(dis));
        memset(ct,0,sizeof(ct));
        dis[2]=0;q.push(2);
        while(!q.empty()){
            int u=q.front();q.pop();vis[u]=0;
            for(int i=h[u];i;i=net[i])
                if(dis[to[i]]>dis[u]+w[i]){
                    dis[to[i]]=dis[u]+w[i];
                    if(!vis[to[i]])vis[to[i]]=1,q.push(to[i]);
                }
        }
        For(u,1,n)
            for(int i=h[u];i;i=net[i])
                if(dis[u]<=dis[to[i]]) ct[i]=1;
    }
    
    il void solve(){
        memset(ans,0,sizeof(ans));
        ans[1]=1;deta[1]=1;
        q.push(1);
        while(!q.empty()){
            int u=q.front();vis[u]=0;q.pop();
            for(int i=h[u];i;i=net[i])
            if(!ct[i]){
                deta[to[i]]+=deta[u],
                ans[to[i]]+=deta[u];
                if(!vis[to[i]]) vis[to[i]]=1,q.push(to[i]);
            }
            deta[u]=0;
        }
        printf("%d
    ",ans[2]);
    }
    
    int main(){
        int u,v,c;
        while(scanf("%d",&n)==1){
            if(!n)break;
            m=gi();
            cnt=0;
            memset(h,0,sizeof(h));
            For(i,1,m) u=gi(),v=gi(),c=gi(),add(u,v,c),add(v,u,c);
            pre(),solve();
        }
        return 0;
    }
  • 相关阅读:
    关于设置日期的代码
    图片拉伸方法以及修改图片渲染模式以及如何把一个控制器包装成一个导航控制器
    统一设置导航栏与状态栏代码
    CALayer加阴影后动画卡的处理办法
    Mac下显示隐藏所有文件
    删除当前目录下的所有.svn
    基础知识
    sql 学习5
    c#多线程学习
    xml序列化
  • 原文地址:https://www.cnblogs.com/five20/p/9348243.html
Copyright © 2011-2022 走看看