版を刷る・まとめます。


強いアムウェイブラック先輩板http://blog.csdn.net/loi_black/article/details/531616荍t 18
最短短絡:
spfa
//         o(ke),k          ,k  <=2 
#include
#include
#include
#include
#define maxn 1000001
#define inf 0x7ffffff
using namespace std;
//   nxt  next,    
int n,m,tot;
int head[maxn],next[maxn],dist[maxn];
bool vis[maxn];

struct node
{
    int from,to,w;
}e[maxn];

void add(int from,int to,int w)
{
    e[++tot] = (node){from,to,w};
    next[tot] = head[from];
    head[from] = tot;
/*    e[t].from=i;
    e[t].to=j;
    e[t].w=w;
    e[t].next=head[i];
    head[i]=++t;
*/
}
//      ,        (          )     
void spfa(int s)
{
    queue <int> q;
    for(int i=1;i<=n;i++) dist[i]=inf;   
    q.push(s);
    vis[s]=true;
    dist[s]=0;
    while(!q.empty())
    {//  for       u        , :  (  )   ,  for            zdl 
        int u=q.front();
        q.pop();
        vis[u]=false;
        for(int i=head[u];i!=-1;i=next[i])
        {//             ,e[i].next:        (     )
            int v=e[i].to;
            if(dist[v]>dist[u]+e[i].w)
            {
                dist[v]=dist[u]+e[i].w;
                if(!vis[v])//      (       ,   ,vis ==0??????) 
                {
                    q.push(v);
                    vis[v]=true;                             
                }
            }
        }
    }
}

int main()
{
    freopen("spfa.in","r",stdin); 
    freopen("spfa.out","w",stdout); 

    int a,b,c,s,e; 
    //t=0; 
    memset(head,-1,sizeof(head)); //head        add(a,b,c)   
    scanf("%d%d",&n,&m); 
    for(int i=1;i<=m;i++) 
    {
        scanf("%d%d%d",&a,&b,&c); 
        add(a,b,c); 
        //add(y,x,z);              ,    ,      ,                
        //!!!   ,          ,          
    } 
    // s->e    (zdl)
    scanf("%d%d",&s,&e); 
    spfa(s); 
    if(dist[e]==inf) printf("-1
"
); else printf("%d",dist[e]); return 0; } /* , Dijkstra , (Dijkstra ) , , , 。!!! SPFA , , , 。!!! , , , , , , 。 */
+SLF最適化
#include
#include
#include
#include
#include
#define maxn 20000+10
#define inf 10001
using namespace std;

int n,m,tot=0;
int dis[maxn],head[maxn],next[maxn],vis[maxn];

struct node{
    int f,t,w;
}e[maxn];

void add(int f,int t,int w)
{
    e[++tot]=(node){f,t,w};
    next[tot]=head[f];
    head[f]=tot;
    return;
}

deque <int> q;
void spfa(int x)
{   
    while(!q.empty()) q.pop_front();
    memset(vis,0,sizeof(vis));  
    memset(dis,inf,sizeof(dis)); 

    q.push_back(x);
    vis[x]=1; dis[x]=0;
    //q.push_back(0);//           ,push 0     v               ,            ,   exe         

    while(!q.empty())
    {
        int u=q.front();
        q.pop_front();
        vis[u]=0;
        for(int i=head[u];i!=-1;i=next[i])
        {
            int v=e[i].t; 
            if(dis[v]>dis[u]+e[i].w)
            {
                dis[v]=dis[u]+e[i].w;
                if(vis[v]==0)
                {
                    if(q.empty()) q.push_front(v);
                    else
                    {
                        if(dis[v]>dis[q.front()]) q.push_back(v);
                        else q.push_front(v);
                    }
                    vis[v]=1;
                    //dis[v] < dis[q.front()] ? q.push_front(v) : q.push_back(v);
                }       
            }
        }
    }
    return;
}

int main()
{
    int a,b,c,s,e;
    memset(head,-1,sizeof(head));
    scanf("%d%d%d%d",&n,&m,&s,&e);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        add(b,a,c);
    }
    spfa(s);
    printf("%d
"
,dis[e]); return 0; }
spfa判定負環bfs
//maxn<=200001 (         ) TLE --->  P3385    
#include 
#include 
#include 
#include 
#include 
#define maxn 200001 
using namespace std; 

int n,m,t=0,tot=0,num[maxn]; 
int dis[maxn],first[maxn],nxt[maxn]; 
bool vis[maxn]; 

struct node{ 
    int f,t,d; 
}e[maxn*2]; 

deque <int> q;  
void add(int f,int t,int d) 
{ 
    e[++tot]=(node){f,t,d}; 
    nxt[tot]=first[f]; 
    first[f]=tot; 
} 

bool spfa(int x)
{ 
    for(int i=1;i<=n;i++) dis[i]=0x3f3f3f; 
    memset(vis,false,sizeof(vis)); 
    while(!q.empty()) q.pop_front(); 

    q.push_front(x); 
    vis[x]=true; 
    dis[x]=0; 
    while(!q.empty()) 
    { 
        int u=q.front(); 
        q.pop_front(); 
        vis[u]=false; 
        for(int i=first[u];i!=-1;i=nxt[i]) 
        { 
            int v=e[i].t; 
            if(dis[v]>dis[u]+e[i].d) 
            { 
                dis[v]=dis[u]+e[i].d; 
                if(!vis[v]) 
                { 
                    if(++num[v]>n) return false; 
                    if(q.empty()) q.push_front(v); 
                    else 
                    { 
                        if(dis[v]>dis[q.front()]) q.push_back(v);  
                        else q.push_front(v); 
                    } 
                }  
            } 
        } 
    } 
    return true; 
} 

int main() 
{ 
    freopen("fuhuan.in","r",stdin); 
    freopen("fuhuan.out","w",stdout);  

    int a,b,w; 
    scanf("%d",&t); 
    while(t--) 
    { 
        memset(first,-1,sizeof(first));
        memset(num,0,sizeof(num));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        { 
            scanf("%d%d%d",&a,&b,&w); 
            if(w < 0) add(a,b,w); 
            else { add(a,b,w); add(b,a,w); } 
        } 
        if(!spfa(1)) printf("YE5
"
); else printf("N0
"
); } return 0; }
dfs
// bfs 
//      ,                ,          ,                  
#include
#include
#include
#include
#define maxn 200001
using namespace std;

int n,m,t,tot,a,b,w;   
int dis[maxn],first[maxn],nxt[maxn*2];//nxt[]   !!!  
bool vis[maxn],flag;

struct node{
    int f,t,d;
}e[maxn*2];

inline int read()
{ 
    char ch=getchar(); 
    int x=0,f=1; 
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } 
    while(ch>='0'&&ch<='9') { x=x*10+ch-48; ch=getchar(); } 
    return x*f;
}

void add(int f,int t,int d)
{
    e[++tot]=(node){ f,t,d };
    nxt[tot]=first[f];
    first[f]=tot;
}

void spfa(int u)
{
    int v;
    vis[u]=true;
    for(int i=first[u];i;i=nxt[i])
    {
        v=e[i].t;
        if(dis[v]>dis[u]+e[i].d)
        {
            dis[v]=dis[u]+e[i].d;
            if(vis[v]||flag)
            {
                flag=true;
                break;
            }
            spfa(v);
        }
    }
    vis[u]=false; 
}

int main()
{
    freopen("fuhuan.in","r",stdin);
    freopen("fuhuan.out","w",stdout);

    t=read();
    while(t--)
    {
        flag=false; tot=0;
        n=read();m=read();
        for(int i=1;i<=n;i++) { dis[i]=0;vis[i]=0;first[i]=0; }
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&w);
            add(a,b,w);
            if(w>=0) add(b,a,w);
        }
        for(int i=1;i<=n;i++)
        {
            spfa(i);
            if(flag) break;
        }
        if(flag)
            printf("YE5
"
); else printf("N0
"
); } return 0; } // 0, , // // , , ,
dijkstra
#include
#include
#define Max 0x3fffffff
int map[1005][1005];
int dis[1005];

void dijkstra(int n)
{
    int visit[1001]={0};
    int min,i,j,k;
    visit[1]=1;
    for(i=1;i1;
        //        ,           
        //--->         ,          ,    maxn,     
        //                           ,           ,
        //        ,                    ,      
        // “        ”:           ,             ,       ,
        //             ,                 
        for(j=1;j<=n;++j)
        {
            if(!visit[j]&&min>dis[j])
            {
                min=dis[j];
                k=j;
            }
        }
        visit[k]=1;
        //                    :                        
        //         
        //     map[k][j]         Max,dis[j]  >dis[k]+map[k][j],        
        for(j=1;j<=n;++j)
        {
            if(!visit[j]&&dis[j]>dis[k]+map[k][j])
                dis[j]=dis[k]+map[k][j];
        }
    }
    printf("%d
"
,dis[n]); } int main() { int t,n,i,j,from,to,cost; while(scanf("%d%d",&t,&n)!=EOF) { for(i=1;i<=n;++i) { map[i][i]=0; for(j=1;jmap
[i][j]=map[j][i]=Max; } for(i=1;i<=t;++i) { scanf("%d%d%d",&from,&to,&cost); if(cost<map[from][to]) //---> , , Max map[from][to]=map[to][from]=cost; } for(i=1;i<=n;++i) dis[i]=map[1][i];//dis i , ( ), map Max dijkstra(n); } return 0; }
並べ替えで逆順を求める
注釈版があります
#include
#include
#include
#include
#define ll long long
using namespace std;

const ll maxn=100000+10;
ll a[maxn],b[maxn];
ll n,total;

void msort(ll l,ll r)
{ 
    ll mid=l + r >> 1;
    if(l//           (l=r),     ,            
    {//    l=r  ,     , l=r       ,         ,                --->from baike 
        msort(l,mid); 
        msort(mid+1,r); //                        ,                     
    }  

    //               ,              :
    //3 2 1 4 6 5    3 2 1   4 6 5    ,   ,3 2 1   4 6 5        3 、2 1   4 、6 5   ,
    //   1    ,      3 2 、1   4 6 、5    
    //     ,3 2 1   4 6 5               ,        

    ll i=l,k=l,j=mid+1;//      
    while(i<=mid&&j<=r)
    { 
        if(a[i]<=a[j]) b[k++]=a[i++];//a            (       +   while      )    b       
                                     //(      (    )      )  
        //b             ,a[i] ,  b,i++,a[j]         (i+1)   
        else 
        { 
            total+=mid-i+1;//i   (i~mid)+i  (i  ) //         ,    “       ”,         
            b[k++]=a[j++];//      
        } 
    } 
    while(i<=mid) b[k++]=a[i++]; //j        ,i     ,  i      ,           ① 
    while(j<=r) b[k++]=a[j++];  //i        ,j     ,  j      ,           ②  
    for(ll i=l;i<=r;i++) a[i]=b[i]; //    (        ) b      a   (//          ) 
    //    (        --->  while             ,
    //          ,           (                    。)) b      a ,  a 
    //    ,         
    //  ,① ②      (       /  ) 
}  

int main() 
{ 
    scanf("%d",&n); 
    for(ll i=1;i<=n;i++) 
    { 
        scanf("%d",&a[i]); 
    } 
    msort(1,n); 
    printf("%lld
"
,total); return 0; } /* :why total+=mid-i+1 4 5 1 6 2 3 , : 4 5 1①--->4 5②,1---> 4,5,1 ... 6 2 3③--->6 2,④1---> 6,2,1 ... , ④--->③--->②--->① , , , 4 5 1 6 2 3 , , , ( , , , , “ ”, ) , , , , “ ” , , > , “ ” , , “ ” , total+=mid-i+1 : , :1 4 5 | 2 3 6, 4 2 , , ,4 , 4 ( 5), 2 , 4 , 2 , total , 4 (+1) 4 (mid-i(i 4 ,mid )), mid-i+1 , : total+=mid-i+1 , , , ,total+=mid-i+1 */
コメントなし:(はい、コメントをなくしました♪(^∇^*)
#include
#include
#define maxn 100010
#define ll long long
using namespace std;

ll n,a[maxn],b[maxn],ans=0;

void gbpx(ll l,ll r)
{
    ll mid=(l+r)/2;
    if(l1,r);
    } 
    ll i=l,j=mid+1,k=l;
    while(i<=mid&&j<=r)//"<="      i/j      
    { 
        if(a[i]<=a[j]) 
        {
            b[k++]=a[i++];
        }
        else
        {
            b[k++]=a[j++]; ans+=mid-i+1;
        }
    } 

    while(i<=mid) b[k++]=a[i++];//"<="            (                )     
    while(j<=r) b[k++]=a[j++];    
    for(int i=l;i<=r;i++) a[i]=b[i];      
} 

int main() 
{ 
    scanf("%lld",&n); 
    for(ll i=1;i<=n;i++) scanf("%d",&a[i]); 
    gbpx(1,n); 
    printf("%lld
"
,ans); return 0; }
//          tot    a    ,  tot      ^3^