嘤嘤

在这里插入图片描述
最短路吧,老师把SPFA卡了让我们知道SPFA是一个辣鸡的算法 (逃

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define MAXM 400010
#define ll long long
const ll inf=1e16;
struct edge{
    int to,nxt,val,pos;
}e[MAXM<<1],E[MAXM<<1];
struct node{
    int num; ll dis;
    bool operator<(node b) const
    {
        return dis>b.dis;
    }
};
int dfn[MAXN],low[MAXN],col[MAXN];
ll dis[MAXN];
int ans;
int head[MAXN],head1[MAXN];
bool vis[MAXN];
int num,cnt,n,m;
void add_edge(int u,int v,int w,int g)
{
 e[++num].to=v;
  e[num].nxt=head[u];
 e[num].val=w;
 e[num].pos=g;
 head[u]=num;
 e[++num].to=u;
 e[num].nxt=head[v];
 e[num].val=w;
 e[num].pos=g;
 head[v]=num;
}
void Add_edge(int u,int v,int w)
{
 E[++num].to=v;
 E[num].nxt=head1[u];
 E[num].pos=w;
 head1[u]=num;
 E[++num].to=u;
 E[num].nxt=head1[v];
 E[num].pos=w;
 head1[v]=num;
}
priority_queue<node>q;
void dij()
{
 for(int i=1;i<=n;i++) dis[i]=inf,vis[i]=0;
 dis[1]=0,q.push((node){1,0});
 while (!q.empty())
    {
  node x=q.top(); q.pop();
  if (vis[x.num]) continue;
  vis[x.num]=1;
        for (int i=head[x.num];i;i=e[i].nxt)
        {
   int v=e[i].to;
   if(dis[v]>dis[x.num]+e[i].val)
   {
    dis[v]=dis[x.num]+e[i].val;
    q.push((node){v,dis[v]});
   }
  }
 }
}
void Dfs(int x)
{
 vis[x]=1;
 for (int i=head[x];i; i=e[i].nxt)
 {
  int v=e[i].to;
  if (dis[x]!=dis[v]+e[i].val) continue;
  Add_edge(v,x,e[i].pos);
  if(vis[v]) continue;
  Dfs(v);
 }
}
void Tarjan(int x,int fa)
{
 low[x]=dfn[x]=++cnt;
 for (int i=head1[x];i;i=E[i].nxt)
 {
  int v=E[i].to;
  if (!dfn[v])
  {
   if(E[i].pos==fa) continue;
   Tarjan(v,E[i].pos);
   low[x]=min(low[x],low[v]);
   if(low[v]>dfn[x]) col[E[i].pos]=1,ans++;
  }
  else if(dfn[v]<dfn[x] && E[i].pos!=fa) low[x]=min(low[x],dfn[v]);
 }
}
void Rebuild()
{
 num=0;
 for(int i=1;i<=n;i++) vis[i]=0;
 Dfs(n);
}
void Get_ans()
{
 num=0;
 Tarjan(1,0);
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m; ++i)
    {
     int u,v,w;scanf("%d%d%d",&u,&v,&w);
        add_edge(u,v,w,i);
    }
    dij();
    Rebuild();
    Get_ans();
    printf("%d\n",ans);
    for(int i=1;i<=m;i++) if(col[i]) printf("%d ",i);
    return 0;
}

来源:zr

好的,以下是Java代码实现: ```java // 定义抽象鸟类 abstract class Bird { // 定义鸟的名字属性 private String name; // 构造函数 public Bird(String name) { this.name = name; } // 抽象方法:鸟的叫声 public abstract void chirp(); // 抽象方法:判断鸟是否能飞 public abstract boolean canFly(); // getter方法:获取鸟的名字 public String getName() { return name; } } // 鸵鸟类 class Ostrich extends Bird { // 构造函数 public Ostrich(String name) { super(name); } // 实现抽象方法:鸵鸟的叫声 public void chirp() { System.out.println(get() + "的叫声:咯咯咯"); } // 实现抽象方法:判断鸵鸟是否能飞 public boolean canFly() { return false; } } // 麻雀类 class Sparrow extends Bird { // 构造函数 public Sparrow(String name) { super(name); } // 实现抽象方法:麻雀的叫声 public void chirp() { System.out.println(getName() + "的叫声:"); } // 实现抽象方法:判断麻雀是否能飞 public boolean canFly() { return true; } } public class BirdTest { public static void main(String[] args) { // 创建鸵鸟对象 Ostrich ostrich = new Ostrich("鸵鸟"); System.out.print(ostrich.getName() + ":"); ostrich.chirp(); System.out.println(ostrich.getName() + "能飞吗?" + ostrich.canFly()); // 创建麻雀对象 Sparrow sparrow = new Sparrow("麻雀"); System.out.print(sparrow.getName() + ":"); sparrow.chirp(); System.out.println(sparrow.getName() + "能飞吗?" + sparrow.canFly()); } } ``` 在这个程序中,我们定义了一个抽象的`Bird`类,其中包含了鸟的名字属性和两个抽象方法:鸟的叫声和判断鸟是否能飞。然后,我们派生出鸵鸟类`Ostrich`和麻雀类`Sparrow`,并实现了它们各自的叫声和能飞的判断方法。最后,我们在测试程序中创建了一个鸵鸟对象和一个麻雀对象,并输出它们的叫声和能飞的判断结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值