2 条题解

  • 0
    @ 2025-10-8 17:10:01
    #include <bits/stdc++.h>
    using namespace std;
    typedef pair<int, int> PII;
    const int N = 1005, INF = 0x3f3f3f3f;
    vector<PII> G[N];
    using namespace std;  
    struct node{int col, c, id;} a[12];  
    bool cmp(const node n1, const node n2) {return n1.col < n2.col;}
    int n, m, dp[N][1 << 10], g[1 << 10]; bool vis[N];  
    void dijkstra(int s)
    {
        memset(vis, 0, sizeof(vis));
        priority_queue<PII, vector<PII>, greater<PII>> q;
        for(int i = 1; i <= n; i++) if(dp[i][s] != INF) q.push({dp[i][s], i});
        while(!q.empty())
        {
            int x = q.top().second; q.pop();
            if(vis[x]) continue;
            vis[x] = 1;
            for(auto i : G[x])
            {
                int y = i.first, w = i.second;
                if(dp[y][s] > dp[x][s] + w)
                {
                    dp[y][s] = dp[x][s] + w;
                    q.push({dp[y][s], y});
                }
            }
        }
    }  
    int solve(int cnt)  
    {  
        for(int S = 1; S < (1 << cnt); S++)  
        {  
            for(int i = 1; i <= n; i++)  
            {  
                for(int s = S - 1; s; s = S & (s - 1))  
                    dp[i][S] = min(dp[i][S], dp[i][s] + dp[i][S ^ s]);  
            }  
            dijkstra(S);  
        }  
        int res = INF;  
        for(int i = 1; i <= n; i++) res = min(res, dp[i][(1 << cnt) - 1]);  
        return res;  
    }  
    
    int main()  
    {   
        int m, k; scanf("%d%d%d", &n, &m, &k);
        for(int i = 1, x, y, w; i <= m; i++)
        {
            scanf("%d%d%d", &x, &y, &w);
            G[x].push_back({y, w});
            G[y].push_back({x, w});
        }
        for(int i = 1; i <= k; i++) scanf("%d%d", &a[i].col, &a[i].id);  
        sort(a + 1, a + k + 1, cmp); 
        int Cn = 0;
        for(int i = 1; i <= k; i++)  // 离散化 
        {  
            if(a[i].col != a[i - 1].col) a[i].c = ++Cn;
            else a[i].c = Cn; 
        }
        memset(g, 0x3f, sizeof(g));  
        for(int S = 1; S < (1 << Cn); S++)  
        {  
            memset(dp, 0x3f, sizeof(dp));  
            int cnt = 0;   
            for(int j = 1; j <= k; j++)
                if((1 << (a[j].c - 1)) & S)
                    dp[a[j].id][1 << cnt++] = 0;  
            g[S] = solve(cnt);  
        }   
        for(int S = 1; S < (1 << Cn); S++)  
            for(int s = S - 1; s; s = S & (s - 1))  
                g[S] = min(g[S], g[s] + g[S ^ s]);
    
        printf("%d\n", g[(1 << Cn) - 1]);
        return 0;  
    }
    
    • 0
      @ 2025-10-8 17:09:28
      #include <bits/stdc++.h>
      using namespace std;
      typedef pair<int,int> PII;
      const int N=1005, INF=0x3f3f3f3f;
      vector<PII>G[N];
      using namespace std;  
      struct node{int col,c,id;}a[12];  
      bool cmp(const node n1, const node n2) {return n1.col < n2.col;}
      int n,dp[N][1<<10],g[1<<10];bool vis[N];  
      void dijkstra(int s)
      {
      	memset(vis, 0, sizeof(vis));
          priority_queue<PII,vector<PII>,greater<PII>> q;
      	for(int i=1;i<=n;i++)if(dp[i][ s ]!=INF)q.push({dp[i][ s ],i});
      	while(!q.empty())
      	{
      		int x=q.top().second;q.pop();
      		if(vis[x])continue;
      		vis[x]=1;
      		for(auto i:G[x])
      		{
      			int y=i.first,w=i.second;
      			if(dp[y][ s ]>dp[x][ s ]+w)
      			{
      				dp[y][ s ]=dp[x][ s ]+w;
      				q.push({dp[y][ s ],y});
      			}
      		}
      	}
      }
      int solve(int cnt)  
      {  
          for(int S=1;S<(1<<cnt);S++)  
          {  
              for(int i=1;i<=n;i++)  
              {  
                  for(int s=S-1;s;s=S&(s-1))  
                      dp[i][S]=min(dp[i][S],dp[i][s]+dp[i][S^s]);  
              }  
              dijkstra(S);  
          }  
          int res=INF;  
          for(int i=1;i<=n;i++) res=min(res,dp[i][(1<<cnt)-1]);  
          return res;  
      }  
        
      int main()  
      {   
          int m,k;scanf("%d%d%d",&n,&m,&k);
      	for(int i=1,x,y,w;i<=m;i++)
      	{
      		scanf("%d%d%d",&x,&y,&w);
      		G[x].push_back({y,w});
      		G[y].push_back({x,w});
      	}
          for(int i=1;i<=k;i++) scanf("%d%d",&a[i].col,&a[i].id);  
          sort(a+1,a+k+1,cmp); 
          int Cn=0;
          for(int i=1;i<=k;i++)  //离散化 
          {  
              if(a[i].col != a[i-1].col )a[i].c=++Cn;
              else a[i].c=Cn; 
          }
          memset(g,0x3f,sizeof(g));  
          for (int S=1;S<(1<<Cn);S++)  
          {  
              memset(dp,0x3f,sizeof(dp));  
              int cnt=0;   
              for(int j=1;j<=k;j++)
                  if( (1<<a[j].c - 1) & S )
                      dp[a[j].id][1<<cnt++] = 0;  
              g[S]=solve(cnt);  
           }   
          for(int S=1;S<(1<<Cn);S++)  
              for(int s=S-1;s;s=S&(s-1))  
                  g[S]=min(g[S],g[s]+g[S^s]);
      
          printf("%d\n",g[(1<<Cn)-1]);
          return  0;  
      } 
      • 1

      信息

      ID
      5671
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      6
      已通过
      2
      上传者