Untitled
unknown
plain_text
a year ago
4.4 kB
4
Indexable
import java.util.*; class PC { int id; int level; Set<File> sharedFiles = new HashSet<>(); ArrayList<Link> links = new ArrayList<>(); Link tmpLink; public PC(int id) { this.id = id; } } class Link { PC from; PC to; BandWidth bandWidth; public Link(PC from, PC to, BandWidth bandWidth) { this.from = from; this.to = to; this.bandWidth = bandWidth; } } class File { int fileSize; public File(int mFilesize) { this.fileSize = mFilesize; } } class BandWidth { int total; int remain; public BandWidth(int bandWidth) { total = bandWidth; remain = bandWidth; } } class Request { File file; ArrayList<PC> pcs = new ArrayList<>(); ArrayList<BandWidth> bandWidths = new ArrayList<>(); } class UserSolution { PC[] pcs; HashMap<String, File> fileHashMap; HashMap<String, Link> linkHashMap; Request[] requests; public void init(int N, int mUID1[], int mUID2[], int mBandwidth[]) { fileHashMap = new HashMap<>(); linkHashMap = new HashMap<>(); requests = new Request[5001]; pcs = new PC[N + 1]; for (int i = 0; i <= N; i++) { pcs[i] = new PC(i); } for (int i = 0; i < N - 1; i++) { BandWidth bandWidth = new BandWidth(mBandwidth[i]); Link link = new Link(pcs[mUID1[i]], pcs[mUID2[i]], bandWidth); pcs[mUID2[i]].links.add(link); Link link2 = new Link(pcs[mUID2[i]], pcs[mUID1[i]], bandWidth); pcs[mUID1[i]].links.add(link2); } } public int share(int mUID, char mFilename[], int mFilesize) { File file = fileHashMap.get(charArrayToString(mFilename)); if (file == null) file = new File(mFilesize); fileHashMap.put(charArrayToString(mFilename), file); pcs[mUID].sharedFiles.add(file); return pcs[mUID].sharedFiles.size(); } public int request(int mUID, char mFilename[], int mTID) { Request request = new Request(); Queue<PC> queue = new ArrayDeque<>(); File file = fileHashMap.get(charArrayToString(mFilename)); if (file == null) { return -1; } queue.add(pcs[mUID]); pcs[mUID].level = 0; PC from = new PC(1000); from.level = 1000; boolean[] mark = new boolean[201]; while (!queue.isEmpty()) { PC pc = queue.poll(); mark[pc.id] = true; if (pc.level > from.level) { break; } if (pc.sharedFiles.contains(file)) { from.level = pc.level; if (pc.id < from.id) { from = pc; } } for (Link link : pc.links) { if (link.bandWidth.remain >= file.fileSize) { if (!mark[link.from.id]) { queue.add(link.from); link.from.level = pc.level + 1; link.from.tmpLink = link; } } } } if (from.id == 1000) return -1; PC tmp = from; request.file = file; while (true) { request.bandWidths.add(tmp.tmpLink.bandWidth); tmp.tmpLink.bandWidth.remain -= file.fileSize; tmp = tmp.tmpLink.to; request.pcs.add(tmp); if (tmp.id == mUID) break; } requests[mTID] = request; return from.id; } public int complete(int mTID) { Request request = requests[mTID]; for (PC pc : request.pcs) { pc.sharedFiles.add(request.file); } for (BandWidth b : request.bandWidths) { b.remain += request.file.fileSize; } return request.pcs.get(request.pcs.size() - 1).sharedFiles.size(); } String charArrayToString(char[] chars) { String result = ""; for (char c : chars ) { if (c == '\0') { break; } result += c; } return result; } }
Editor is loading...
Leave a Comment