1. 程式人生 > 其它 >常用登陸驗證-後端AuthController.php

常用登陸驗證-後端AuthController.php

1.Prim

#include<iostream>
#include<cstring>
#define MAXN 1000
#define INF 0xfffffff
using namespace std;
int n,m,s,e,val;
int sum=0;
void prim();
int w[MAXN][MAXN];
int mst[MAXN];
int lowcost[MAXN];
int main()
{
    memset(w,0x7f,sizeof(w));
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin
>>s>>e>>val; w[s][e]=val; w[e][s]=val; } prim(); cout<<sum<<endl; return 0; } void prim() { for(int i=2;i<=n;i++) { lowcost[i]=w[1][i]; mst[i]=1; } mst[1]=0; for(int i=2;i<=n;i++) { int min=0x7f
; int minid=0; for(int j=2;j<=n;j++) { if(lowcost[j]<min&&lowcost[j]!=0) { min=lowcost[j]; minid=j; } } // cout<<"V"<<mst[minid]<<"-V"<<minid<<"="<<min<<endl;
sum+=min; lowcost[minid]=0; for(int j=2;j<=n;j++) { if(w[minid][j]<lowcost[j]) { lowcost[j]=w[minid][j]; mst[j]=minid; } } } }

2.Kruskal

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt=0,f[6000];
long long ans=0;
struct p
{
    int start;
    int end;
    int val;
}line[200011];
int find(int x)
{
    if(f[x]!=x) f[x]=find(f[x]);
    return f[x];
}
bool judge(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y) return true;
    else return false;
}
void merge(int x,int y)
{
    x=find(x);
    y=find(y);
    f[x]=y;
}
bool cmp(p n1,p n2)
{
    return n1.val<n2.val;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=m;i++)
        cin>>line[i].start>>line[i].end>>line[i].val;
    sort(line+1,line+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        int u=find(line[i].start);
        int v=find(line[i].end);
        if(judge(u,v)) continue;
        merge(u,v);
        cnt++;
        ans+=line[i].val;
        if(cnt==n-1) break;
    }
    if(cnt==n-1) cout<<ans<<endl;
    else cout<<"orz"<<endl;
    return 0;
}
//兩者區別:Prim在稠密圖中比Kruskal優,在稀疏圖中比Kruskal劣。Prim是以更新過的節點的連邊找最小值,Kruskal是直接將邊排序。
//兩者其實都是運用貪心的思路